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 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440
|
local lua_file = nil
--load common functions
lua_file = nuvie_load("common/common.lua"); lua_file();
OBJLIST_OFFSET_HOURS_TILL_NEXT_HEALING = 0x1cf2
OBJLIST_OFFSET_PREV_PLAYER_X = 0x1d03
OBJLIST_OFFSET_PREV_PLAYER_Y = 0x1d04
OBJLIST_OFFSET_1D22_UNK = 0x1d22
OBJLIST_OFFSET_DREAM_MODE_FLAG = 0x1d29
OBJLIST_OFFSET_BERRY_COUNTERS = 0x1d2f
OBJLIST_OFFSET_DREAM_STAGE = 0x1d53
function dbg(msg_string)
--io.stderr:write(msg_string)
end
g_hours_till_next_healing = 0
g_in_dream_mode = false
local g_selected_obj
local g_attack_target
function update_watch_tile()
local anim_index = get_anim_index_for_tile(616) --616 = watch tile
if anim_index ~= nil then
local new_watch_tile = 416 + clock_get_hour() % 12
anim_set_first_frame(anim_index, new_watch_tile)
end
end
function load_game()
g_selected_obj = nil
g_attack_target = nil
objlist_seek(OBJLIST_OFFSET_HOURS_TILL_NEXT_HEALING)
g_hours_till_next_healing = objlist_read1()
objlist_seek(OBJLIST_OFFSET_DREAM_MODE_FLAG)
g_in_dream_mode = bit32.btest(objlist_read2(), 0x10)
map_enable_temp_actor_cleaning(not g_in_dream_mode)
if g_in_dream_mode then
lock_inventory_view(Actor.get(0))
end
objlist_seek(OBJLIST_OFFSET_DREAM_STAGE)
g_current_dream_stage = objlist_read2()
objlist_seek(OBJLIST_OFFSET_PREV_PLAYER_X)
g_prev_player_x = objlist_read1()
objlist_seek(OBJLIST_OFFSET_PREV_PLAYER_Y)
g_prev_player_y = objlist_read1()
objlist_seek(OBJLIST_OFFSET_1D22_UNK)
g_objlist_1d22_unk = objlist_read1()
update_watch_tile()
end
function save_game()
objlist_seek(OBJLIST_OFFSET_HOURS_TILL_NEXT_HEALING)
objlist_write1(g_hours_till_next_healing)
objlist_seek(OBJLIST_OFFSET_DREAM_MODE_FLAG)
local bytes = objlist_read2()
if g_in_dream_mode then
bytes = bit32.bor(bytes, 0x10)
else
bytes = bit32.band(bytes, 0xFFEF)
end
objlist_seek(OBJLIST_OFFSET_DREAM_MODE_FLAG)
objlist_write2(bytes)
objlist_seek(OBJLIST_OFFSET_DREAM_STAGE)
objlist_write2(g_current_dream_stage)
objlist_seek(OBJLIST_OFFSET_PREV_PLAYER_X)
objlist_write1(g_prev_player_x)
objlist_seek(OBJLIST_OFFSET_PREV_PLAYER_Y)
objlist_write1(g_prev_player_y)
objlist_seek(OBJLIST_OFFSET_1D22_UNK)
objlist_write1(g_objlist_1d22_unk)
end
local g_container_obj_tbl = {
[80]=1, [81]=1, [82]=1,
[83]=1, [85]=1, [86]=1,
[87]=1, [89]=1,[304]=1,
[139]=1,[341]=1,[257]=1,
[104]=1,[284]=1,[285]=1
}
function is_blood(obj_num)
if obj_num == 334 or obj_num == 335 or obj_num == 336 then --OBJ_BLOOD, OBJ_ICHOR, OBJ_SAP
return true
end
return false
end
function is_container_obj(obj_num)
if g_container_obj_tbl[obj_num] ~= nil then
return true
end
return false
end
--OBJ_CLOSED_DOOR, OBJ_GLOW_WORM, OBJ_DEVIL_POD, OBJ_DEVIL_PLANT, OBJ_GLASS_PITCHER
local attackable_obj_tbl = {
[0xB3]=1,
[0x184]=1,
[0x133]=1,
[0x12C]=1,
[0xD9]=1,
}
function is_obj_attackable(obj)
return attackable_obj_tbl[obj.obj_n] ~= nil
end
--OBJ_VINE, OBJ_TREE, OBJ_PORCUPOD, OBJ_FLOWER, OBJ_HARD_SHELLED_PLANT
--OBJ_DEVIL_PLANT, OBJ_DEVIL_POD, OBJ_HEDGE
local plant_obj_tbl = {
[0xCD]=1,
[0x198]=1,
[0xA8]=1,
[0xAA]=1,
[0xAB]=1,
[0x12C]=1,
[0x133]=1,
[0x12B]=1,
}
function is_plant_obj(obj)
return plant_obj_tbl[obj.obj_n] ~= nil
end
--OBJ_DOLLAR, OBJ_RUBLE, OBJ_PHOTOGRAPH, OBJ_THREAD, OBJ_BOX_OF_CIGARS
--OBJ_MATCH, OBJ_BOOK, OBJ_MAP, OBJ_NOTE, OBJ_WORMSBANE_SEED
--OBJ_SCROLL, OBJ_LIVE_MARTIAN_SEED, OBJ_PILE_OF_COAL
--OBJ_HUGE_LUMP_OF_COAL, OBJ_CHUNK_OF_ICE
local burnable_obj_tbl = {
[0x18]=1,
[0x84]=1,
[0x0B9]=1,
[0x3E]=1,
[0x65]=1,
[0x6B]=1,
[0x94]=1,
[0x96]=1,
[0x97]=1,
[0x9E]=1,
[0x0F3]=1,
[0x0FC]=1,
[0x1BC]=1,
[0x1BF]=1,
[0x100]=1,
}
function is_obj_burnable(obj)
return burnable_obj_tbl[obj.obj_n] ~= nil
end
function is_open_water_at_loc(x, y, z)
local tile_num = map_get_tile_num(x, y, z)
local is_water = tile_get_flag(tile_num, 1, 0)
if not is_water then
return false
end
if not tile_get_flag(tile_num, 1, 1) then -- not blocked
return false
end
for obj in objs_at_loc(location) do
tile_num = obj.tile_num
--FIXME original does this too
-- sub ax, word_40FA2
if tile_get_flag(tile_num, 3, 1) or tile_get_flag(tile_num, 3, 2) then --SUPPORT_OBJECT or FORCE_PASSABLE
return false
end
end
return true
end
function search(obj)
if obj.on_map == false then
return
end
local found_obj = false
local child
local first_loop = true
local prev_obj = nil
for child in container_objs(obj) do
if prev_obj ~= nil then
printfl("SEARCH_NEXT_OBJ", prev_obj.look_string)
Obj.moveToMap(prev_obj, obj.x, obj.y, obj.z)
end
if first_loop == true then
found_obj = true
printfl("SEARCHING_HERE_YOU_FIND", child.look_string)
Obj.moveToMap(child, obj.x, obj.y, obj.z)
else
prev_obj = child
end
script_wait(50)
first_loop = false
end
if prev_obj ~= nil then
printfl("SEARCH_LAST_OBJ", prev_obj.look_string)
Obj.moveToMap(prev_obj, obj.x, obj.y, obj.z)
end
if found_obj == false then
printl("SEARCHING_HERE_YOU_FIND_NOTHING")
else
print(".\n")
end
end
--tile_num, readied location
local g_readiable_objs_tbl = {
-- 0 = head
[512] = 0, --cap
[513] = 0, --cowboy hat
[514] = 0, --pith hat
[515] = 0, --military hat
[516] = 0, --derby
-- 1 = neck
[517] = 1, --kerchief
[518] = 1, --silk scarf
[519] = 1, --muffler
[1048] = 1, --martian jewelry
[1049] = 1, --martian jewelry
[1050] = 1, --martian jewelry
[1051] = 1, --martian jewelry
[1052] = 1, --martian jewelry
[1053] = 1, --martian jewelry
[1054] = 1, --martian jewelry
[1055] = 1, --martian jewelry
-- 3 = 1 handed
[527] = 3, --bloody saber
[552] = 3, --derringer
[553] = 3, --revolver
[560] = 3, --hatchet
[561] = 3, --axe
[562] = 3, --ball-peen hammer
[565] = 3, --knife
[566] = 3, --machete
[567] = 3, --saber
[622] = 3, --pry bar
[650] = 3, --weed sprayer
[667] = 3, --tongs
[1068] = 3, --martian ritual pod knife
-- 2 = torso
[528] = 2, --cloth jacket
[529] = 2, --wool sweater
[530] = 2, --cape
[531] = 2, --duster
[532] = 2, --wool overcoat
[533] = 2, --sheepskin jacket
[534] = 2, --arctic parka
[608] = 2, --electric belt
-- 3 = shield hand
[630] = 3, --torch
[631] = 3, --lit torch
[632] = 3, --candlestick
[633] = 3, --lit candlestick
[634] = 3, --candelabra
[635] = 3, --lit candelabra
[636] = 3, --oil lamp
[637] = 3, --lit oil lamp
[638] = 3, --lantern
[639] = 3, --lit lantern
-- 6 = UNK pants or dress FIXME: putting this here for now
[536] = 6, --cotton pants
[537] = 6, --cotton dress
[538] = 6, --denim jeans
[539] = 6, --wool pants
[540] = 6, --wool dress
[541] = 6, --chaps and jeans
-- 7 = feet
[520] = 7, --man's shoes
[521] = 7, --woman's shoes
[522] = 7, --riding boots
[523] = 7, --ruby slippers
[524] = 7, --thigh boots
[525] = 7, --hip boots
[526] = 7, --winged shoes
[542] = 7, --man's shoes
-- 4 = two handed
[551] = 4, --Cupid's bow and arrows
[554] = 4, --shotgun
[555] = 4, --rifle
[556] = 4, --Belgian combine
[557] = 4, --elephant gun
[558] = 4, --sling
[559] = 4, --bow
[563] = 4, --sledge hammer
[576] = 4, --pick
[577] = 4, --shovel
[578] = 4, --hoe
[579] = 4, --rake
[580] = 4, --pitchfork
[581] = 4, --cultivator
[582] = 4, --scythe
[583] = 4, --saw
[717] = 4, --throw rug
[718] = 4, --red cape
[1066] = 4, --heat ray gun
[1067] = 4, --freeze ray gun
[1093] = 4, --spray gun
[1095] = 4, --martian hoe (couldn't be equipped in original)
[1096] = 4, --martian scythe (couldn't be equipped in original)
[1097] = 4, --martian pitchfork (couldn't be equipped in original)
[1098] = 4, --martian rake (couldn't be equipped in original)
[1099] = 4, --martian shovel (couldn't be equipped in original)
[1188] = 4, --M60 machine gun
[1206] = 4, --martian pick (couldn't be equipped in original)
[1897] = 4, --pool cue
-- 5 = finger gloves and bracelets FIXME: putting this here for now
[544] = 5, --lady's silk gloves
[545] = 5, --driving gloves
[546] = 5, --cotton work gloves
[547] = 5, --work gloves
[548] = 5, --wool mittens
[549] = 5, --rubber gloves
[550] = 5 --welding gloves
}
function wrap_coord(coord, level)
local map_stride = 1024
if level ~= 0 then
map_stride = 256
end
if coord < 0 then
return map_stride + coord
end
return coord % map_stride
end
function can_move_obj(obj, rel_x, rel_y)
local z = obj.z
return map_can_put_obj(wrap_coord(obj.x+rel_x,z), wrap_coord(obj.y+rel_y,z), z)
end
function obj_get_readiable_location(obj)
if g_readiable_objs_tbl[obj.tile_num] ~= nil then
return g_readiable_objs_tbl[obj.tile_num]
end
return -1
end
function update_lamp_posts()
--Turn lamps on/off if we have power and it is dark.
local frame_n = 3
local hour = clock_get_hour()
if Actor.get_talk_flag(0x73, 4) and (hour < 6 or hour > 17) then
frame_n = 7
end
local loc = player_get_location()
for obj in find_obj(loc.z, 228) do --OBJ_LAMP_POST
if obj ~= nil then
obj.frame_n = frame_n
end
end
end
local PLAY_ASYNC = true
function play_md_sfx(sfx_id, play_async)
--FIXME
end
function play_door_sfx()
--FIXME
end
function create_object_needs_quan(obj_n)
-- obj.stackable is already checked
if obj_n == 196 or obj_n == 311 or obj_n == 312 then --OBJ_LEVER, OBJ_SWITCH, OBJ_SWITCH1
return true
else
return false
end
end
function input_select_obj_qty(obj)
if not obj.stackable then
return 1
end
printl("HOW_MANY")
local qty = input_select_integer("0123456789", true)
if qty > obj.qty then
return obj.qty
end
return qty
end
--load actor functions
local actor_load = nuvie_load("md/actor.lua");
if type(actor_load) == "function" then
actor_load()
else
if type(actor_load) == "string" then
--io.stderr:write(actor_load);
end
end
look_init = nuvie_load("md/look.lua"); look_init();
combat_init = nuvie_load("md/combat.lua"); combat_init();
-- init usecode
usecode_init = nuvie_load("md/usecode.lua"); usecode_init();
talk_init = nuvie_load("md/talk.lua"); talk_init();
player_init = nuvie_load("md/player.lua"); player_init();
worktype_init = nuvie_load("md/worktype.lua"); worktype_init();
dreamworld_init = nuvie_load("md/dreamworld.lua"); dreamworld_init();
|