aboutsummaryrefslogtreecommitdiff
path: root/debug/char.lua.X
diff options
context:
space:
mode:
Diffstat (limited to 'debug/char.lua.X')
-rw-r--r--debug/char.lua.X266
1 files changed, 266 insertions, 0 deletions
diff --git a/debug/char.lua.X b/debug/char.lua.X
new file mode 100644
index 0000000..bc01108
--- /dev/null
+++ b/debug/char.lua.X
@@ -0,0 +1,266 @@
+Pos Lua >> Moon
+2 1:[ local util = require("util") ] >> 2:[ util = require "util" ]
+24 2:[ local broadphase = require("broadphase") ] >> 3:[ broadphase = require "broadphase" ]
+58 3:[ local main = require("main") ] >> 4:[ main = require "main" ]
+80 4:[ local constrain = require("constrain") ] >> 5:[ constrain = require "constrain" ]
+112 5:[ local color = require("color") ] >> 6:[ color = require "color" ]
+136 6:[ local room = require("room") ] >> 7:[ room = require "room" ]
+179 8:[ LobbyRoom = room.LobbyRoom ] >> 8:[ import LobbyRoom from room ]
+185 9:[ local ability_reg = require("ability_reg") ] >> 9:[ ability_reg = require "ability_reg" ]
+223 10:[ local mod = ... ] >> 12:[ mod = ... ]
+233 11:[ mod.characters = { } ] >> 13:[ mod.characters = {} ]
+253 12:[ mod.classes = { } ] >> 14:[ mod.classes = {} ]
+270 13:[ require("char_tank") ] >> 15:[ require "char_tank" ]
+290 14:[ require("char_mage") ] >> 16:[ require "char_mage" ]
+310 15:[ require("char_theif") ] >> 17:[ require "char_theif" ]
+331 16:[ require("char_fool") ] >> 18:[ require "char_fool" ]
+351 17:[ require("char_jugg") ] >> 19:[ require "char_jugg" ]
+371 18:[ mod.class_order = { ] >> 20:[ mod.class_order = { ]
+392 19:[ "Tumbler", ] >> 21:[ "Tumbler", ]
+404 20:[ "Fire Breather", ] >> 22:[ "Fire Breather", ]
+422 21:[ "Juggler", ] >> 23:[ "Juggler", ]
+434 22:[ "Troubador", ] >> 24:[ "Troubador", ]
+448 23:[ "Juggernaut" ] >> 25:[ "Juggernaut" ]
+371 24:[ } ] >> 20:[ mod.class_order = { ]
+463 25:[ mod.class_order_rev = { } ] >> 27:[ mod.class_order_rev = {} ]
+498 26:[ for k, v in ipairs(mod.class_order) do ] >> 28:[ for k,v in ipairs(mod.class_order) ]
+524 27:[ mod.class_order_rev[v] = k ] >> 29:[ mod.class_order_rev[v] = k ]
+488 28:[ end ] >> 28:[ for k,v in ipairs(mod.class_order) ]
+551 29:[ print("After requireing characters, mod.classes was", mod.classes) ] >> 30:[ print("After requireing characters, mod.classes was",mod.classes) ]
+617 30:[ mod.enemies = { } ] >> 31:[ mod.enemies = {} ]
+652 31:[ require("e_bethany") ] >> 33:[ require "e_bethany" ]
+672 32:[ require("e_ruminating_randy") ] >> 34:[ require "e_ruminating_randy" ]
+701 33:[ require("e_mopey_marvin") ] >> 35:[ require "e_mopey_marvin" ]
+726 34:[ require("e_sullen_salley") ] >> 36:[ require "e_sullen_salley" ]
+752 35:[ require("e_child") ] >> 37:[ require "e_child" ]
+770 36:[ print("After requireing rat, mod.enemies was", mod.enemies) ] >> 38:[ print("After requireing rat, mod.enemies was",mod.enemies) ]
+928 45:[ key = "<input>" ] >> 42:[ new:(key = "<input>") => ]
+945 47:[ self.time = 0 ] >> 43:[ @time = 0 ]
+957 48:[ self.key = key ] >> 44:[ @key = key ]
+970 49:[ self.value = false ] >> 45:[ @value = false ]
+1049 71:[ self.anim = anim ] >> 51:[ @anim = anim ]
+1064 72:[ self.interupt = interupt ] >> 52:[ @interupt = interupt ]
+1087 73:[ self.mode = mode ] >> 53:[ @mode = mode ]
+1133 96:[ action = "<input>" ] >> 56:[ new:(action = "<input>") => ]
+1150 98:[ self.time = 0 ] >> 57:[ @time = 0 ]
+1162 99:[ self.action = action ] >> 58:[ @action = action ]
+1180 114:[ mod.sprite_direction_co = function(self) ] >> 60:[ mod.sprite_direction_co = () => ]
+1213 115:[ return function() ] >> 61:[ return () -> ]
+1233 116:[ while true do ] >> 62:[ while true ]
+1242 117:[ self:stop_anim(self.sprites.right) ] >> 63:[ @stop_anim(@sprites.right) ]
+1272 118:[ self:stop_anim(self.sprites.left) ] >> 64:[ @stop_anim(@sprites.left) ]
+1301 119:[ self:stop_anim(self.sprites.stop_right) ] >> 65:[ @stop_anim(@sprites.stop_right) ]
+1336 120:[ self:stop_anim(self.sprites.stop_left) ] >> 66:[ @stop_anim(@sprites.stop_left) ]
+1370 121:[ self:stop_anim(self.sprites.falling_left) ] >> 67:[ @stop_anim(@sprites.falling_left) ]
+1407 122:[ self:stop_anim(self.sprites.falling_right) ] >> 68:[ @stop_anim(@sprites.falling_right) ]
+1459 123:[ local _list_0 = self.inputs ] >> 69:[ for input in *@inputs ]
+1473 126:[ if self.velocity.x > 0.01 then ] >> 70:[ if @velocity.x > 0.01 ]
+1498 127:[ self:set_anim(self.sprites.right, 1, "loop") ] >> 71:[ @set_anim(@sprites.right,1,"loop") ]
+1554 129:[ elseif self.velocity.x < -0.01 then ] >> 73:[ elseif @velocity.x < -0.01 ]
+1580 130:[ self:set_anim(self.sprites.left, 1, "loop") ] >> 74:[ @set_anim(@sprites.left,1,"loop") ]
+1628 134:[ coroutine.yield() ] >> 76:[ coroutine.yield! ]
+1228 135:[ end ] >> 62:[ while true ]
+1213 136:[ end ] >> 61:[ return () -> ]
+1180 137:[ end ] >> 60:[ mod.sprite_direction_co = () => ]
+1646 138:[ mod.can_die_co = function(self) ] >> 78:[ mod.can_die_co = () => ]
+1670 139:[ return function() ] >> 79:[ return () -> ]
+1690 140:[ while not self.dead do ] >> 80:[ while not @dead ]
+1704 141:[ coroutine.yield() ] >> 81:[ coroutine.yield! ]
+1685 142:[ end ] >> 80:[ while not @dead ]
+1734 143:[ for k, v in pairs(self.sprites) do ] >> 83:[ for k,v in pairs @sprites ]
+1755 144:[ if k ~= "idle" then ] >> 84:[ if k ~= "idle" ]
+1772 145:[ self:stop_anim(v) ] >> 85:[ @stop_anim(v) ]
+1753 146:[ end ] >> 84:[ if k ~= "idle" ]
+1724 147:[ end ] >> 83:[ for k,v in pairs @sprites ]
+1790 148:[ if self.sprites.die then ] >> 86:[ if @sprites.die ]
+1807 149:[ self:set_anim(self.sprites.die, 5) ] >> 87:[ @set_anim(@sprites.die,5) ]
+1788 150:[ end ] >> 86:[ if @sprites.die ]
+1835 151:[ return coroutine.yield(true) ] >> 88:[ coroutine.yield(true) ]
+1670 152:[ end ] >> 79:[ return () -> ]
+1646 153:[ end ] >> 78:[ mod.can_die_co = () => ]
+1858 154:[ mod.make_animate = function(c) ] >> 90:[ mod.make_animate = (c) -> ]
+1885 155:[ assertf(c.sprites ~= nil, "Tried to animate something that had no .sprites: %q", c.__class.__name) ] >> 91:[ assertf(c.sprites ~= nil, "Tried to animate something that had no .sprites: %q", c.__class.__name) ]
+1985 156:[ assertf(c.sprites.idle ~= nil and #c.sprites.idle > 0, "Tried to animate something without a .idle animation: %q", c.__class.__name) ] >> 92:[ assertf(c.sprites.idle ~= nil and #c.sprites.idle > 0, "Tried to animate something without a .idle animation: %q", c.__class.__name) ]
+2119 157:[ c.anim_stack = { ] >> 93:[ c.anim_stack = {AnimFrame(c.sprites.idle,0,"loop")} ]
+2135 158:[ AnimFrame(c.sprites.idle, 0, "loop") ] >> 93:[ c.anim_stack = {AnimFrame(c.sprites.idle,0,"loop")} ]
+2119 159:[ } ] >> 93:[ c.anim_stack = {AnimFrame(c.sprites.idle,0,"loop")} ]
+2172 160:[ c.anim = c.sprites.idle ] >> 94:[ c.anim = c.sprites.idle ]
+2197 161:[ c.keyframe = 0 ] >> 95:[ c.keyframe = 0 ]
+2213 162:[ c.animrate = c.animrate or 1 ] >> 96:[ c.animrate = c.animrate or 1 ]
+2243 163:[ c.anim_interupt = 0 ] >> 97:[ c.anim_interupt = 0 ]
+2264 164:[ c.set_anim = function(self, tbl, interupt, mode) ] >> 98:[ c.set_anim = (self,tbl,interupt,mode) -> ]
+2309 165:[ if type(tbl) ~= "table" then ] >> 99:[ if type(tbl) ~= "table" ]
+2334 166:[ error("Tried to set anim to something that was not a table!", 2) ] >> 100:[ error("Tried to set anim to something that was not a table!",2) ]
+2307 167:[ end ] >> 99:[ if type(tbl) ~= "table" ]
+2402 168:[ if #tbl == 0 then ] >> 101:[ if #tbl == 0 ]
+2416 169:[ error("Tried to set anim to an empty table", 2) ] >> 102:[ error("Tried to set anim to an empty table",2) ]
+2400 170:[ end ] >> 101:[ if #tbl == 0 ]
+2467 171:[ if interupt > self.anim_interupt then ] >> 103:[ if interupt > @anim_interupt ]
+2497 172:[ table.insert(self.anim_stack, AnimFrame(tbl, interupt, mode)) ] >> 104:[ table.insert(@anim_stack,AnimFrame(tbl,interupt,mode)) ]
+2555 173:[ self.anim = self.anim_stack[#self.anim_stack].anim ] >> 105:[ @anim = @anim_stack[#@anim_stack].anim ]
+2597 174:[ self.anim_interupt = interupt ] >> 106:[ @anim_interupt = interupt ]
+2465 175:[ end ] >> 103:[ if interupt > @anim_interupt ]
+2264 176:[ end ] >> 98:[ c.set_anim = (self,tbl,interupt,mode) -> ]
+2625 177:[ c.stop_anim = function(self, tbl, err_if_unable) ] >> 108:[ c.stop_anim = (self,tbl,err_if_unable=false) -> ]
+2663 179:[ err_if_unable = false ] >> 108:[ c.stop_anim = (self,tbl,err_if_unable=false) -> ]
+2675 181:[ local anim_found = false ] >> 109:[ anim_found = false ]
+2706 182:[ for k, v in pairs(self.anim_stack) do ] >> 110:[ for k,v in pairs @anim_stack ]
+2730 183:[ if v.anim == tbl then ] >> 111:[ if v.anim == tbl ]
+2785 184:[ anim_found = true ] >> 113:[ anim_found = true ]
+2807 185:[ table.remove(self.anim_stack, k) ] >> 114:[ table.remove(@anim_stack,k) ]
+2728 187:[ end ] >> 111:[ if v.anim == tbl ]
+2696 188:[ end ] >> 110:[ for k,v in pairs @anim_stack ]
+2849 189:[ if err_if_unable then ] >> 116:[ if err_if_unable ]
+2867 190:[ assertf(anim_found, "Could not find animation to remove") ] >> 117:[ assertf(anim_found, "Could not find animation to remove") ]
+2847 191:[ end ] >> 116:[ if err_if_unable ]
+2927 192:[ self.anim = self.anim_stack[#self.anim_stack].anim ] >> 118:[ @anim = @anim_stack[#@anim_stack].anim ]
+2968 193:[ self.anim_interupt = self.anim_stack[#self.anim_stack].interupt ] >> 119:[ @anim_interupt = @anim_stack[#@anim_stack].interupt ]
+2625 194:[ end ] >> 108:[ c.stop_anim = (self,tbl,err_if_unable=false) -> ]
+3022 195:[ return c.node:action(coroutine.create(function() ] >> 121:[ c.node\action(coroutine.create(() -> ]
+3066 196:[ while not c.dead do ] >> 122:[ while not c.dead ]
+3081 197:[ c.keyframe = math.floor(am.current_time() * c.animrate) % #c.anim ] >> 123:[ c.keyframe = math.floor(am.current_time()*c.animrate) % #c.anim ]
+3148 198:[ local spritename = c.anim[c.keyframe + 1] ] >> 124:[ spritename = c.anim[c.keyframe + 1] ]
+3187 199:[ assert(spritename, "Failed to find an appropriate image to draw.") ] >> 125:[ assert(spritename, "Failed to find an appropriate image to draw.") ]
+3291 200:[ c.node("sprite").source = spritename ] >> 127:[ c.node("sprite").source = spritename ]
+3331 201:[ coroutine.yield() ] >> 128:[ coroutine.yield! ]
+3061 202:[ end ] >> 122:[ while not c.dead ]
+3366 203:[ local keyframe_0 = am.current_time() ] >> 130:[ keyframe_0 = am.current_time() ]
+3404 204:[ while c.keyframe < #c.anim - 1 do ] >> 131:[ while c.keyframe < #c.anim - 1 ]
+3433 205:[ c.keyframe = math.floor((am.current_time() - keyframe_0) * c.animrate) ] >> 132:[ c.keyframe = math.floor((am.current_time! - keyframe_0)*c.animrate) ]
+3504 206:[ assert(c.anim[c.keyframe + 1], "Failed to find an appropriate image to draw.") ] >> 133:[ assert(c.anim[c.keyframe + 1], "Failed to find an appropriate image to draw.") ]
+3586 207:[ c.node("sprite").source = c.anim[c.keyframe + 1] ] >> 134:[ c.node("sprite").source = c.anim[c.keyframe + 1] ]
+3638 208:[ coroutine.yield() ] >> 135:[ coroutine.yield! ]
+3399 209:[ end ] >> 131:[ while c.keyframe < #c.anim - 1 ]
+3657 210:[ c:remove() ] >> 136:[ c\remove() ]
+3670 211:[ return coroutine.yield(true) ] >> 137:[ coroutine.yield(true) ]
+3022 212:[ end)) ] >> 121:[ c.node\action(coroutine.create(() -> ]
+1858 213:[ end ] >> 90:[ mod.make_animate = (c) -> ]
+3697 214:[ mod.inherited = { } ] >> 140:[ mod.inherited = {} ]
+3716 215:[ local hp_bar_width = 20 ] >> 141:[ hp_bar_width = 20 ]
+5899 221:[ return string.format("<%s, %s> at (%d)", self.__class.__name, (self.class and self.class.name or "no class"), (self.data and self.data.position or -1)) ] >> 187:[ return string.format( ]
+6264 224:[ for k, v in pairs(self.class) do ] >> 201:[ for k,v in pairs(@class) ]
+6284 225:[ if k:match("^default") then ] >> 202:[ if k\match("^default") ]
+6309 226:[ local field = k:match("^default_(.*)") ] >> 203:[ field = k\match("^default_(.*)") ]
+6348 227:[ if type(v) == "function" then ] >> 204:[ if type(v) == "function" ]
+6376 228:[ self.data[field] = v() ] >> 205:[ @data[field] = v! ]
+6408 230:[ self.data[field] = v ] >> 207:[ @data[field] = v ]
+6282 232:[ end ] >> 202:[ if k\match("^default") ]
+6254 233:[ end ] >> 201:[ for k,v in pairs(@class) ]
+6457 236:[ assert(self.data[name], "Field must exist to be set") ] >> 210:[ assert(@data[name], "Field must exist to be set") ]
+6509 237:[ self.data[name] = value ] >> 211:[ @data[name] = value ]
+6531 238:[ print("my data table is:", self.data) ] >> 212:[ print("my data table is:",@data) ]
+6568 239:[ if name == "hp" then ] >> 213:[ if name == "hp" ]
+6585 240:[ local perc = (self.data.hp / self.data.maxhp) * 20 ] >> 214:[ perc = (@data.hp / @data.maxhp) * 20 ]
+6625 241:[ self.node("hp_fill_scale").x = perc ] >> 215:[ @.node("hp_fill_scale").x = perc ]
+6566 242:[ end ] >> 213:[ if name == "hp" ]
+6679 245:[ print("Serializing char:", self) ] >> 218:[ print("Serializing char:",@) ]
+6710 246:[ print("Name:", self.__class.__name) ] >> 219:[ print("Name:", @@__name) ]
+6737 247:[ print("uname:", self.uname) ] >> 220:[ print("uname:",@uname) ]
+6762 248:[ print("data:", self.data) ] >> 221:[ print("data:",@data) ]
+6785 249:[ local data_abilities = { } ] >> 222:[ data_abilities = {} ]
+6823 250:[ for i, ability in pairs(self.data.abilities) do ] >> 223:[ for i,ability in pairs(@data.abilities) ]
+6850 251:[ data_abilities[i] = ability.__name ] >> 224:[ data_abilities[i] = ability.__name ]
+6807 252:[ end ] >> 223:[ for i,ability in pairs(@data.abilities) ]
+6887 253:[ local data_copy = table.shallow_copy(self.data) ] >> 225:[ data_copy = table.shallow_copy(@data) ]
+6927 254:[ data_copy.abilities = data_abilities ] >> 226:[ data_copy.abilities = data_abilities ]
+6966 255:[ print("class.name:", self.class.name) ] >> 227:[ print("class.name:",@class.name) ]
+7001 256:[ local ret = am.to_json({ ] >> 228:[ ret = am.to_json({name:@@__name, uname:@uname, data:data_copy, class:@class.name}) ]
+7024 257:[ name = self.__class.__name, ] >> 228:[ ret = am.to_json({name:@@__name, uname:@uname, data:data_copy, class:@class.name}) ]
+7040 258:[ uname = self.uname, ] >> 228:[ ret = am.to_json({name:@@__name, uname:@uname, data:data_copy, class:@class.name}) ]
+7053 259:[ data = data_copy, ] >> 228:[ ret = am.to_json({name:@@__name, uname:@uname, data:data_copy, class:@class.name}) ]
+7070 260:[ class = self.class.name ] >> 228:[ ret = am.to_json({name:@@__name, uname:@uname, data:data_copy, class:@class.name}) ]
+7001 261:[ }) ] >> 228:[ ret = am.to_json({name:@@__name, uname:@uname, data:data_copy, class:@class.name}) ]
+7086 262:[ print("Ret is:", ret) ] >> 229:[ print("Ret is:",ret) ]
+7109 263:[ return ret ] >> 230:[ ret ]
+7141 266:[ print("Deserializing character") ] >> 233:[ print("Deserializing character") ]
+7176 267:[ local tbl = am.parse_json(data) ] >> 234:[ tbl = am.parse_json(data) ]
+7206 268:[ if mod.classes[tbl.class] then ] >> 235:[ if mod.classes[tbl.class] ]
+7233 269:[ local data_abilities = { } ] >> 236:[ data_abilities = {} ]
+7278 270:[ for i, ability_name in pairs(tbl.data.abilities) do ] >> 237:[ for i, ability_name in pairs(tbl.data.abilities) ]
+7309 271:[ data_abilities[i] = ability_reg[ability_name] ] >> 238:[ data_abilities[i] = ability_reg[ability_name] ]
+7256 272:[ end ] >> 237:[ for i, ability_name in pairs(tbl.data.abilities) ]
+7358 273:[ tbl.data.abilities = data_abilities ] >> 239:[ tbl.data.abilities = data_abilities ]
+7397 274:[ return mod.inherited[tbl.name](tbl.uname, tbl.data, mod.classes[tbl.class]) ] >> 240:[ return mod.inherited[tbl.name](tbl.uname, tbl.data, mod.classes[tbl.class]) ]
+7481 275:[ elseif mod.enemies[tbl.class] then ] >> 241:[ elseif mod.enemies[tbl.class] ]
+7508 276:[ local e = mod.Enemy(tbl.data, mod.enemies[tbl.class]) ] >> 242:[ e = mod.Enemy(tbl.data, mod.enemies[tbl.class]) ]
+7559 277:[ e.uname = tbl.uname ] >> 243:[ e.uname = tbl.uname ]
+7582 278:[ return e ] >> 244:[ return e ]
+7616 282:[ return print("draw") ] >> 248:[ print("draw") ]
+7647 285:[ return self.node:remove_all() ] >> 250:[ @node\remove_all! ]
+7679 288:[ self.dead = true ] >> 252:[ @dead = true ]
+7694 289:[ print(self, "is dieing, node is", self.node, "and color is", color) ] >> 253:[ print(@,"is dieing, node is",@.node,"and color is",color) ]
+7754 290:[ self.node("char_sprite"):append(am.line(vec2(-10, -10), vec2(10, 10), 5, color.bright)) ] >> 254:[ @.node("char_sprite")\append(am.line(vec2(-10,-10),vec2(10,10),5,color.bright)) ]
+7836 291:[ return self.node("char_sprite"):append(am.line(vec2(10, -10), vec2(-10, 10), 5, color.bright)) ] >> 255:[ @.node("char_sprite")\append(am.line(vec2(10,-10),vec2(-10,10),5,color.bright)) ]
+7941 294:[ self.room = room ] >> 257:[ @room = room ]
+7956 295:[ print("Character", self, "entered room", room) ] >> 258:[ print("Character",@,"entered room",room) ]
+7999 296:[ self.node("char_translate").y = room.floor_y ] >> 259:[ @.node("char_translate").y = room.floor_y ]
+8045 297:[ if room.__class == LobbyRoom then ] >> 260:[ if room.__class == LobbyRoom ]
+8075 298:[ print("Class was lobbyRoom") ] >> 261:[ print("Class was lobbyRoom") ]
+8107 299:[ local rng_x = math.random(-(main.width / 2), (main.width / 2)) ] >> 262:[ rng_x = math.random(-(main.width/2), (main.width/2)) ]
+8163 300:[ print("RNG x:", rng_x) ] >> 263:[ print("RNG x:",rng_x) ]
+8188 301:[ self.node("char_translate").x = rng_x ] >> 264:[ @.node("char_translate").x = rng_x ]
+8233 303:[ print("Class was not LobbyRoom") ] >> 266:[ print("Class was not LobbyRoom") ]
+8269 304:[ local x_pos = self.room:player_location_of(self.data.position) ] >> 267:[ x_pos = @room\player_location_of(@data.position) ]
+8321 305:[ print("Got x pos for", self, x_pos) ] >> 268:[ print("Got x pos for",@,x_pos) ]
+8355 306:[ self.node("char_translate").x = x_pos + math.random(-15, 15) ] >> 269:[ @.node("char_translate").x = x_pos + math.random(-15,15) --some random variance to stop stacking ]
+8480 310:[ assert(newclass, "Cannot set a class to nil") ] >> 271:[ assert(newclass, "Cannot set a class to nil") ]
+8528 311:[ self.class = newclass ] >> 272:[ @class = newclass ]
+8548 312:[ self:calc_class_values() ] >> 273:[ @calc_class_values! ]
+8570 313:[ self.node("char_sprite").source = newclass.sprite ] >> 274:[ @.node("char_sprite").source = newclass.sprite ]
+8645 316:[ self.data.position = pos ] >> 277:[ @data.position = pos ]
+8694 319:[ self.data.location = loc ] >> 280:[ @data.location = loc ]
+3916 325:[ assert(charclass, "Charclass may not be nil") ] >> 147:[ assert(charclass, "Charclass may not be nil") ]
+3964 326:[ self.uname = uname or false ] >> 148:[ @uname = uname or false ]
+3990 327:[ self.data = data or { ] >> 149:[ @data = data or { ]
+4018 328:[ status = "active", ] >> 150:[ status: "active", ]
+4041 329:[ location = -1, ] >> 151:[ location: -1, ]
+4058 330:[ position = charclass.default_position ] >> 152:[ position: charclass.default_position ]
+3990 331:[ } ] >> 149:[ @data = data or { ]
+4092 332:[ self.class = charclass ] >> 154:[ @class = charclass ]
+4113 333:[ assert(self.class.name, "Character classes must have a name") ] >> 155:[ assert(@class.name, "Character classes must have a name") ]
+4173 334:[ self:calc_class_values() ] >> 156:[ @calc_class_values! ]
+4195 335:[ self.node = am.group() ] >> 157:[ @node = am.group! ]
+4270 336:[ self.node:append(am.translate(0, 0):tag("char_translate") ^ am.sprite(self.class.sprite, color.white, "center", "bottom"):tag("char_sprite")) ] >> 160:[ @node\append(am.translate(0,0)\tag("char_translate")^ am.sprite(@class.sprite,color.white,"center","bottom")\tag("char_sprite")) ]
+4401 337:[ print("A character has been created!") ] >> 161:[ print("A character has been created!") ]
+4442 338:[ print(debug.traceback()) ] >> 162:[ print(debug.traceback!) ]
+4487 339:[ local healthbar_trans = am.translate(0, 60) ] >> 164:[ healthbar_trans = am.translate(0,60) ]
+4526 340:[ local healthbar_left = am.sprite("data/bar_left.png", color.white, "left", "center"):tag("hp_l") ] >> 165:[ healthbar_left = am.sprite("data/bar_left.png", color.white,"left","center")\tag("hp_l") ]
+4617 341:[ local healthbar_right = am.sprite("data/bar_right.png", color.white, "right", "center"):tag("hp_r") ] >> 166:[ healthbar_right = am.sprite("data/bar_right.png", color.white, "right","center")\tag("hp_r") ]
+4712 342:[ local healthbar_bar = am.sprite("data/bar_mid.png", color.white, "left", "center"):tag("hp_b") ] >> 167:[ healthbar_bar = am.sprite("data/bar_mid.png", color.white,"left","center")\tag("hp_b") ]
+4801 343:[ local healthbar_fill = am.sprite("data/bar_fill.png", color.white, "left", "center"):tag("hp_f") ] >> 168:[ healthbar_fill = am.sprite("data/bar_fill.png", color.white,"left","center")\tag("hp_f") ]
+4892 344:[ local healthbar_scale = am.scale(hp_bar_width, 1) ] >> 169:[ healthbar_scale = am.scale(hp_bar_width,1) ]
+4937 345:[ local healthbar_fill_scale = am.scale(hp_bar_width + 1, 1):tag("hp_fill_scale") ] >> 170:[ healthbar_fill_scale = am.scale(hp_bar_width + 1,1)\tag("hp_fill_scale") ]
+5012 346:[ healthbar_trans:append(am.translate(-hp_bar_width, 0) ^ healthbar_left) ] >> 171:[ healthbar_trans\append(am.translate(-hp_bar_width,0)^ healthbar_left) ]
+5084 347:[ healthbar_trans:append(am.translate(hp_bar_width, 0) ^ healthbar_right) ] >> 172:[ healthbar_trans\append(am.translate(hp_bar_width,0)^ healthbar_right) ]
+5156 348:[ healthbar_trans:append(am.translate(-hp_bar_width / 2, 0) ^ healthbar_scale ^ healthbar_bar) ] >> 173:[ healthbar_trans\append(am.translate(-hp_bar_width/2,0)^ healthbar_scale^ healthbar_bar) ]
+5246 349:[ healthbar_trans:append(am.translate((-hp_bar_width / 2) - 1, 0) ^ healthbar_fill_scale ^ healthbar_fill) ] >> 174:[ healthbar_trans\append(am.translate((-hp_bar_width/2) - 1,0)^ healthbar_fill_scale^ healthbar_fill) ]
+5348 350:[ self.node("char_sprite"):append(healthbar_trans) ] >> 175:[ @.node("char_sprite")\append(healthbar_trans) ]
+5419 351:[ assert(self.__class.draw, "Characters must have a draw() method") ] >> 177:[ assert(@.__class.draw,"Characters must have a draw() method") ]
+5483 352:[ table.insert(mod.characters, self) ] >> 178:[ table.insert(mod.characters,@) ]
+5516 353:[ constrain(self, "set anim", function(self, value) ] >> 179:[ constrain(@,"set anim", (self,value) -> ]
+5559 354:[ assertf(type(value) == "table", "Tried to set anim on %q to something other than a table (%q)", self, type(value)) ] >> 180:[ assertf(type(value) == "table", "Tried to set anim on %q to something other than a table (%q)",@, type(value)) ]
+5673 355:[ return assert(#value > 0, "Tried to set animation for char to something with 0 frames!") ] >> 181:[ assert(#value > 0, "Tried to set animation for char to something with 0 frames!") ]
+5516 356:[ end) ] >> 179:[ constrain(@,"set anim", (self,value) -> ]
+5761 357:[ return assert(self.__class ~= Character, "Character class must be subclassed") ] >> 183:[ assert(@.__class != Character,"Character class must be subclassed") ]
+3809 371:[ self.classes = { } ] >> 144:[ @classes = {} ]
+3824 372:[ self.players = { } ] >> 145:[ @players = {} -- players singleton, [peerid] = Character ]
+6074 374:[ assert(c, "Inheritance must exist") ] >> 195:[ assert(c, "Inheritance must exist") ]
+6112 375:[ assert(c.__name, "Inherited class must have a .__name") ] >> 196:[ assert(c.__name, "Inherited class must have a .__name") ]
+6170 376:[ self.__class.classes[c.__name] = c ] >> 197:[ @@.classes[c.__name] = c ]
+6197 377:[ mod.inherited[c.__name] = c ] >> 198:[ mod.inherited[c.__name] = c ]
+8716 381:[ mod.enemy_counter = 0 ] >> 282:[ mod.enemy_counter = 0 ]
+8757 385:[ local _parent_0 = Character ] >> 283:[ class Enemy extends Character ]
+8927 388:[ self(data, eclass) ] >> 288:[ @(data, eclass) ]
+8946 389:[ mod.enemy_counter = mod.enemy_counter + 1 ] >> 290:[ mod.enemy_counter += 1 ]
+8990 392:[ return string.format("<%s> at (%d)", self.uname, self.data.position or 0) ] >> 292:[ return string.format("<%s> at (%d)",@uname, @data.position or 0) ]
+9127 395:[ print("Character", self, "entered room", room) ] >> 295:[ print("Character",@,"entered room",room) ]
+9170 396:[ self.room = room ] >> 296:[ @room = room ]
+9185 397:[ self.node("char_translate").y = self.room.floor_y ] >> 297:[ @.node("char_translate").y = @room.floor_y ]
+9230 398:[ self.node("char_translate").x = self.room:enemy_location_of(self.data.position) ] >> 298:[ @.node("char_translate").x = @room\enemy_location_of(@data.position) ]
+9325 401:[ return self.class.select_action(self) ] >> 301:[ return @class.select_action(@) ]
+8794 408:[ _class_0.__parent.__init(self, eclass.name .. ":" .. tostring(mod.enemy_counter), data, eclass) ] >> 285:[ super(eclass.name .. ":" .. tostring(mod.enemy_counter), data, eclass) ]
+8867 409:[ mod.enemy_counter = mod.enemy_counter + 1 ] >> 286:[ mod.enemy_counter += 1 ]
+9357 438:[ mod["Character"] = Character ] >> 303:[ mod["Character"] = Character ]
+9386 439:[ mod["KeyInput"] = KeyInput ] >> 304:[ mod["KeyInput"] = KeyInput ]
+9413 440:[ mod["Enemy"] = Enemy ] >> 305:[ mod["Enemy"] = Enemy ]
+9475 441:[ return mod ] >> 307:[ mod ]