summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/dat/clua/lm_toll.lua
blob: 96b9675d135664bc221766473fabfca2bdc399cb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
------------------------------------------------------------------------------
-- lm_toll.lua:
-- One-way toll-stair marker.
------------------------------------------------------------------------------

require("clua/lm_1way.lua")

TollStair = util.subclass(OneWayStair)
TollStair.CLASS = "TollStair"

function TollStair:new(props)
  local toll = self.super.new(self, props)
  if not props.amount or props.amount < 1 then
    error("Bad toll amount: " .. props.amount)
  end
  toll.seen = 0
  return toll
end

function TollStair:activate(marker)
  self.super.activate(self, marker)

  dgn.register_listener(dgn.dgn_event_type("v_leave_level"),
                        marker, marker:pos())
  dgn.register_listener(dgn.dgn_event_type("player_los"),
                        marker, marker:pos())
end

function TollStair:check_shopping_list(marker, first_time)
  local name = self.props.overmap

  if you.shopping_list_has(name, marker) then
    return
  end

  local ask_name = name
  if first_time then
    ask_name = "" .. self.props.amount .. " gp " .. ask_name
  end

  if crawl.yesno("Add " .. ask_name .. " to shopping list? (y/N)",
                 true, "n")
  then
    local verb = self.props.shop_verb or "enter"

    you.shopping_list_add(name, verb, self.props.amount, marker)

    crawl.mpr("You can access your shopping list by pressing '$'.")
  end
end

function TollStair:event(marker, ev)
  if ev:type() == dgn.dgn_event_type('player_los') then
    local x, y = ev:pos()

    -- Only prompt to add to shopping list the first time we are seen.
    if self.seen == 1 then
      return true
    end

    self.seen = 1

    if self.props.amount <= you.gold() then
      return true
    end

    self:check_shopping_list(marker, true)

    return true
  end

  return self.super.event(self, marker, ev)
end

function TollStair:check_veto(marker, pname)
  -- Have we enough gold?
  local gold = you.gold()
  local needed = self.props.amount

  if gold < needed then
    crawl.mpr("This portal charges " .. needed .. " gold for entry; " ..
              "you have only " .. gold .. " gold.")
    self:check_shopping_list(marker)
    return "veto"
  end

  if pname == "veto_stair" then
    -- Ok, ask if the player wants to spend the $$$.
    if not crawl.yesno("This portal charges " .. needed ..
                       " gold for entry. Pay?", true, "n") then
      self:check_shopping_list(marker)
      return "veto"
    end
  elseif pname == "veto_level_change" then
    local name = self.props.overmap
    if you.shopping_list_has(name, marker) then
      crawl.mpr("Removing " .. name .. " from shopping list")
      you.shopping_list_del(name, marker)
    end

    -- Gold gold gold! Forget that gold!
    you.gold(you.gold() - needed)

    local toll_desc
    if self.props.toll_desc then
        toll_desc = self.props.toll_desc
    else
        toll_desc = "at " .. crawl.article_a(self.props.desc)
    end
    crawl.take_note("You paid a toll of " .. needed .. " gold " ..
                    toll_desc .. ".")
    return
  end
end

function TollStair:property(marker, pname)
  if pname == 'veto_stair' or pname == 'veto_level_change' then
    return self:check_veto(marker, pname)
  end

  if pname == 'feature_description_long' then
    return self:feature_description_long(marker)
  end

  return self.super.property(self, marker, pname)
end

function TollStair:feature_description_long(marker)
  local desc = self:unmangle(self.props.desc_long)
  if desc then
    desc = desc .. "\n\n"
  else
    desc = ""
  end
  return desc .. "The portal charges " .. self.props.amount .. " for entry.\n"
end

function TollStair:write(marker, th)
  TollStair.super.write(self, marker, th)
  file.marshall(th, self.seen)
end

function TollStair:read(marker, th)
  TollStair.super.read(self, marker, th)
  self.seen = file.unmarshall_number(th)

  setmetatable(self, TollStair)
  return self
end

function toll_stair(pars)
  return TollStair:new(pars)
end