diff --git a/data/area/kharidian_desert/kalphite_hive/kalphite.combat.toml b/data/area/kharidian_desert/kalphite_hive/kalphite.combat.toml index a60f4c1507..b32c91e8de 100644 --- a/data/area/kharidian_desert/kalphite_hive/kalphite.combat.toml +++ b/data/area/kharidian_desert/kalphite_hive/kalphite.combat.toml @@ -2,14 +2,14 @@ attack_speed = 4 retreat_range = 8 defend_anim = "kalphite_defend" -defend_sound = "kalphite_defend" +defend_sound = "insect_defend" death_anim = "kalphite_death" -death_sound = "kalphite_death" +death_sound = "insect_death" [kalphite_worker.melee] range = 1 anim = "kalphite_attack" -target_sound = "kalphite_attack" +target_sound = "insect_attack" target_hit = { offense = "crush", max = 30 } [kalphite_guardian] diff --git a/data/area/kharidian_desert/kalphite_hive/kalphite.sounds.toml b/data/area/kharidian_desert/kalphite_hive/kalphite.sounds.toml index fc8c63422c..e3a2a83147 100644 --- a/data/area/kharidian_desert/kalphite_hive/kalphite.sounds.toml +++ b/data/area/kharidian_desert/kalphite_hive/kalphite.sounds.toml @@ -1,10 +1,10 @@ -[kalphite_attack] +[insect_attack] id = 537 -[kalphite_death] +[insect_death] id = 538 -[kalphite_defend] +[insect_defend] id = 539 [kalphite_queen_attack] diff --git a/data/area/misthalin/draynor/draynor.teles.toml b/data/area/misthalin/draynor/draynor.teles.toml index 0f80219fd1..456491209b 100644 --- a/data/area/misthalin/draynor/draynor.teles.toml +++ b/data/area/misthalin/draynor/draynor.teles.toml @@ -64,4 +64,9 @@ delta = { x = -35, y = 6421 } [133] option = "Climb-down" tile = { x = 3092, y = 3362 } -delta = { x = 25, y = 6392 } \ No newline at end of file +delta = { x = 25, y = 6392 } + +[portal_home] +option = "Enter" +tile = { x = 2678, y = 5214, level = 2 } +to = { x = 3110, y = 3363, level = 2 } diff --git a/data/area/misthalin/draynor/manor/draynor_manor.objs.toml b/data/area/misthalin/draynor/manor/draynor_manor.objs.toml new file mode 100644 index 0000000000..34d27657de --- /dev/null +++ b/data/area/misthalin/draynor/manor/draynor_manor.objs.toml @@ -0,0 +1,19 @@ +[draynor_manor_door_sign_closed] +id = 47421 +examine = "A large double door." + +[draynor_manor_door_sign_opened] +id = 47423 +examine = "A large double door." + +[draynor_manor_door_opened] +id = 47425 +examine = "A large double door." + +[draynor_manor_door_closed] +id = 47424 +examine = "A large double door." + +[portal_home] +id = 11356 +examine = "A gateway back to Gielinor." \ No newline at end of file diff --git a/data/area/morytania/braindeath_island/braindeath_island.anims.toml b/data/area/morytania/braindeath_island/braindeath_island.anims.toml new file mode 100644 index 0000000000..2a619f7fdb --- /dev/null +++ b/data/area/morytania/braindeath_island/braindeath_island.anims.toml @@ -0,0 +1,17 @@ +[spider_large_defend] +id = 5320 + +[spider_large_attack] +id = 5319 + +[spider_large_death] +id = 5321 + +[zombie_pirate_defend] +id = 5653 + +[zombie_pirate_attack] +id = 5651 + +[zombie_pirate_death] +id = 5654 \ No newline at end of file diff --git a/data/area/morytania/braindeath_island/braindeath_island.combat.toml b/data/area/morytania/braindeath_island/braindeath_island.combat.toml new file mode 100644 index 0000000000..0d4afb1a3b --- /dev/null +++ b/data/area/morytania/braindeath_island/braindeath_island.combat.toml @@ -0,0 +1,36 @@ +[fever_spider] +attack_speed = 4 +retreat_range = 8 +defend_anim = "spider_large_defend" +defend_sound = "insect_defend" +death_anim = "spider_large_death" +death_sound = "insect_death" + +[fever_spider.melee] +condition = "slayer_gloves" +range = 1 +anim = "spider_large_attack" +target_sound = "insect_attack" +target_hit = { offense = "stab", max = 70 } + +[fever_spider.disease] +condition = "no_slayer_gloves" +range = 1 +anim = "spider_large_attack" +target_sound = "insect_attack" +impact_regardless = true +impact_disease = 80 + +[zombie_pirate] +attack_speed = 4 +retreat_range = 8 +defend_anim = "zombie_pirate_defend" +defend_sound = "zombie_pirate_defend" +death_anim = "zombie_pirate_death" +death_sound = "zombie_pirate_death" + +[zombie_pirate.melee] +range = 1 +anim = "zombie_pirate_attack" +target_sound = "zombie_pirate_attack" +target_hit = { offense = "crush", max = 60 } diff --git a/data/area/morytania/braindeath_island/braindeath_island.npcs.toml b/data/area/morytania/braindeath_island/braindeath_island.npcs.toml index e14d5ac58d..ffc974d9eb 100644 --- a/data/area/morytania/braindeath_island/braindeath_island.npcs.toml +++ b/data/area/morytania/braindeath_island/braindeath_island.npcs.toml @@ -17,21 +17,27 @@ id = 2830 [zombie_protester] id = 2831 +hunt_mode = "spotted" [zombie_protester_2] id = 2832 +hunt_mode = "spotted" [zombie_protester_3] id = 2833 +hunt_mode = "spotted" [zombie_protester_4] id = 2834 +hunt_mode = "spotted" [zombie_protester_5] id = 2835 +hunt_mode = "spotted" [zombie_protester_6] id = 2836 +hunt_mode = "spotted" [zombie_pirate] id = 2837 @@ -39,12 +45,12 @@ hitpoints = 520 att = 49 str = 50 def = 50 -style = "crush" -max_hit_melee = 60 +combat_def = "zombie_pirate" hunt_mode = "cowardly" slayer_xp = 52.0 categories = ["zombies"] respawn_delay = 50 +drop_table = "pirate" examine = "An undead sea scoundrel." [zombie_pirate_2] @@ -73,11 +79,11 @@ hitpoints = 500 att = 45 str = 50 def = 50 -style = "crush" -max_hit_melee = 60 +combat_def = "zombie_pirate" slayer_xp = 50.0 categories = ["zombies"] respawn_delay = 37 +drop_table = "pirate" examine = "He talks a good fight." [zombie_swab_2] diff --git a/data/area/morytania/braindeath_island/braindeath_island.objs.toml b/data/area/morytania/braindeath_island/braindeath_island.objs.toml new file mode 100644 index 0000000000..9bc261c723 --- /dev/null +++ b/data/area/morytania/braindeath_island/braindeath_island.objs.toml @@ -0,0 +1,11 @@ +[braindeath_island_wooden_stair_down] +id = 10137 + +[braindeath_island_wooden_stair_up] +id = 10136 + +[braindeath_island_ladder_up] +id = 10167 + +[braindeath_island_ladder_down] +id = 10168 diff --git a/data/area/morytania/braindeath_island/braindeath_island.sounds.toml b/data/area/morytania/braindeath_island/braindeath_island.sounds.toml new file mode 100644 index 0000000000..0ea7fe50cc --- /dev/null +++ b/data/area/morytania/braindeath_island/braindeath_island.sounds.toml @@ -0,0 +1,8 @@ +[zombie_pirate_defend] +id = 926 + +[zombie_pirate_attack] +id = 924 + +[zombie_pirate_death] +id = 925 diff --git a/data/area/morytania/braindeath_island/braindeath_island.teles.toml b/data/area/morytania/braindeath_island/braindeath_island.teles.toml new file mode 100644 index 0000000000..04ce8e4018 --- /dev/null +++ b/data/area/morytania/braindeath_island/braindeath_island.teles.toml @@ -0,0 +1,69 @@ +[braindeath_island_wooden_stair_down] +option = "Climb-down" +tile = { x = 2152, y = 5109, level = 1 } +to = { x = 2150, y = 5109 } + +[braindeath_island_wooden_stair_up] +option = "Climb-up" +tile = { x = 2151, y = 5109 } +to = { x = 2153, y = 5108, level = 1 } + +[braindeath_island_wooden_stair_down] +option = "Climb-down" +tile = { x = 2163, y = 5088, level = 1 } +to = { x = 2166, y = 5088 } + +[braindeath_island_wooden_stair_up] +option = "Climb-up" +tile = { x = 2163, y = 5088 } +to = { x = 2163, y = 5089, level = 1 } + +[braindeath_island_wooden_stair_down] +option = "Climb-down" +tile = { x = 2149, y = 5088, level = 1 } +to = { x = 2152, y = 5088 } + +[braindeath_island_wooden_stair_up] +option = "Climb-up" +tile = { x = 2149, y = 5088 } +to = { x = 2149, y = 5089, level = 1 } + +[braindeath_island_wooden_stair_down] +option = "Climb-down" +tile = { x = 2137, y = 5088, level = 1 } +to = { x = 2140, y = 5088 } + +[braindeath_island_wooden_stair_up] +option = "Climb-up" +tile = { x = 2137, y = 5088 } +to = { x = 2137, y = 5089, level = 1 } + +[braindeath_island_wooden_stair_down] +option = "Climb-down" +tile = { x = 2129, y = 5095, level = 1 } +to = { x = 2129, y = 5093 } + +[braindeath_island_wooden_stair_up] +option = "Climb-up" +tile = { x = 2129, y = 5094 } +to = { x = 2130, y = 5096, level = 1 } + +[braindeath_island_ladder_up] +option = "Climb-up" +tile = { x = 2163, y = 5092, level = 1 } +to = { x = 2162, y = 5092, level = 2 } + +[braindeath_island_ladder_down] +option = "Climb-down" +tile = { x = 2163, y = 5092, level = 2 } +to = { x = 2162, y = 5092, level = 1 } + +[braindeath_island_ladder_up] +option = "Climb-up" +tile = { x = 2139, y = 5105 } +to = { x = 2138, y = 5105, level = 1 } + +[braindeath_island_ladder_down] +option = "Climb-down" +tile = { x = 2139, y = 5105, level = 1 } +to = { x = 2138, y = 5105 } diff --git a/data/area/morytania/mort_myre_swamp/mort_myre_swamp.npcs.toml b/data/area/morytania/mort_myre_swamp/mort_myre_swamp.npcs.toml index 1b5ad3d719..ab9531ee74 100644 --- a/data/area/morytania/mort_myre_swamp/mort_myre_swamp.npcs.toml +++ b/data/area/morytania/mort_myre_swamp/mort_myre_swamp.npcs.toml @@ -165,5 +165,15 @@ id = 1568 [vampire] id = 1223 +hitpoints = 400 +att = 55 +str = 60 +def = 55 +magic = 40 +range = 1 +slayer_xp = 40.0 +combat_def = "vampyre" +drop_table = "vampyre" +categories = ["vampyres"] examine = "A feral vampyre. It looks really hungry!" diff --git a/data/area/morytania/port_phasmatys/port_phasmatys.combat.toml b/data/area/morytania/port_phasmatys/port_phasmatys.combat.toml new file mode 100644 index 0000000000..8dec1ceb9d --- /dev/null +++ b/data/area/morytania/port_phasmatys/port_phasmatys.combat.toml @@ -0,0 +1,13 @@ +[tortured_soul] +attack_speed = 4 +retreat_range = 8 +defend_anim = "human_defend" +defend_sound = "ghost_defend" +death_anim = "human_death" +death_sound = "ghost_death" + +[tortured_soul.melee] +range = 1 +anim = "unarmed_punch" +target_sound = "ghost_attack2" +target_hit = { offense = "crush", max = 70 } diff --git a/data/area/morytania/port_phasmatys/port_phasmatys.npc-spawns.toml b/data/area/morytania/port_phasmatys/port_phasmatys.npc-spawns.toml index 0872586efe..cdb40517d3 100644 --- a/data/area/morytania/port_phasmatys/port_phasmatys.npc-spawns.toml +++ b/data/area/morytania/port_phasmatys/port_phasmatys.npc-spawns.toml @@ -24,14 +24,14 @@ spawns = [ { id = "ghost_villager_port_phasmatys", x = 3675, y = 3496, members = true }, { id = "ghost_villager_port_phasmatys", x = 3679, y = 3474, members = true }, { id = "ghost_villager_port_phasmatys", x = 3684, y = 3485, members = true }, - { id = "tortured_soul_port_phasmatys", x = 3648, y = 3472, members = true }, - { id = "tortured_soul_port_phasmatys", x = 3649, y = 3503, members = true }, - { id = "tortured_soul_port_phasmatys", x = 3654, y = 3536, members = true }, - { id = "tortured_soul_port_phasmatys", x = 3657, y = 3534, members = true }, - { id = "tortured_soul_port_phasmatys", x = 3666, y = 3529, members = true }, - { id = "tortured_soul_port_phasmatys", x = 3668, y = 3537, members = true }, - { id = "tortured_soul_port_phasmatys", x = 3672, y = 3520, members = true }, - { id = "tortured_soul_port_phasmatys", x = 3673, y = 3528, members = true }, + { id = "tortured_soul", x = 3648, y = 3472, members = true }, + { id = "tortured_soul", x = 3649, y = 3503, members = true }, + { id = "tortured_soul", x = 3654, y = 3536, members = true }, + { id = "tortured_soul", x = 3657, y = 3534, members = true }, + { id = "tortured_soul", x = 3666, y = 3529, members = true }, + { id = "tortured_soul", x = 3668, y = 3537, members = true }, + { id = "tortured_soul", x = 3672, y = 3520, members = true }, + { id = "tortured_soul", x = 3673, y = 3528, members = true }, { id = "ghost_shopkeeper_port_phasmatys", x = 3658, y = 3477, members = true }, { id = "ghost_innkeeper_port_phasmatys", x = 3681, y = 3496, members = true }, { id = "ghost_banker_port_phasmatys", x = 3687, y = 3464 }, @@ -52,7 +52,7 @@ spawns = [ { id = "ghost_guard_port_phasmatys", x = 3652, y = 3487, direction = "WEST", members = true }, { id = "ghost_guard_port_phasmatys", x = 3658, y = 3508, direction = "NORTH", members = true }, { id = "ghost_guard_port_phasmatys", x = 3661, y = 3508, direction = "NORTH", members = true }, - { id = "pirate_pete_port_phasmatys", x = 3680, y = 3537, members = true }, + { id = "pirate_pete", x = 3680, y = 3537, members = true }, { id = "melina_port_phasmatys", x = 3674, y = 3484, members = true }, { id = "droalak_port_phasmatys", x = 3657, y = 3469, members = true }, { id = "bill_teach_port_phasmatys", x = 3713, y = 3497, level = 1, members = true }, diff --git a/data/area/morytania/port_phasmatys/port_phasmatys.npcs.toml b/data/area/morytania/port_phasmatys/port_phasmatys.npcs.toml index 949817071d..f41322d5f5 100644 --- a/data/area/morytania/port_phasmatys/port_phasmatys.npcs.toml +++ b/data/area/morytania/port_phasmatys/port_phasmatys.npcs.toml @@ -26,14 +26,13 @@ examine = "A master bowman." id = 1697 examine = "A spooky ghost villager." -[tortured_soul_port_phasmatys] +[tortured_soul] id = 1698 hitpoints = 510 att = 52 str = 62 def = 38 -style = "crush" -max_hit_melee = 70 +combat_def = "tortured_soul" slayer_xp = 51.0 categories = ["ghosts"] respawn_delay = 50 @@ -68,7 +67,7 @@ id = 1705 id = 1706 examine = "This ghost guards the gates of Port Phasmatys." -[pirate_pete_port_phasmatys] +[pirate_pete] id = 2825 examine = "A shifty-looking character." diff --git a/data/area/morytania/port_phasmatys/port_phasmatys.sounds.toml b/data/area/morytania/port_phasmatys/port_phasmatys.sounds.toml new file mode 100644 index 0000000000..6433b1ef6c --- /dev/null +++ b/data/area/morytania/port_phasmatys/port_phasmatys.sounds.toml @@ -0,0 +1,2 @@ +[cudgel] +id = 1842 \ No newline at end of file diff --git a/data/area/realm/killerwatt_plane/killerwatt_plane.anims.toml b/data/area/realm/killerwatt_plane/killerwatt_plane.anims.toml index 1165b00def..c4194ea3a8 100644 --- a/data/area/realm/killerwatt_plane/killerwatt_plane.anims.toml +++ b/data/area/realm/killerwatt_plane/killerwatt_plane.anims.toml @@ -1,11 +1,11 @@ [killerwatt_death] -id = 3162 +id = 11939 [killerwatt_attack] -id = 3163 +id = 11937 [killerwatt_ranged_attack] -id = 3164 +id = 11936 [killerwatt_defend] -id = 3165 +id = 11938 diff --git a/data/area/realm/killerwatt_plane/killerwatt_plane.combat.toml b/data/area/realm/killerwatt_plane/killerwatt_plane.combat.toml index e09fb3e28e..8691740760 100644 --- a/data/area/realm/killerwatt_plane/killerwatt_plane.combat.toml +++ b/data/area/realm/killerwatt_plane/killerwatt_plane.combat.toml @@ -16,10 +16,15 @@ target_hit = { offense = "stab", max = 60 } condition = "insulated" range = 10 anim = "killerwatt_attack" +projectile = "wind_strike" # TODO proper gfx? +impact_gfx = "wind_strike_impact" target_sound = "killerwatt_attack" target_hit = { offense = "range", defence = "magic", max = 80 } [killerwatt.range_uninsulated] condition = "not_insulated" clone = "killerwatt.range" +target_sound = "killerwatt_electrocutes" +target_gfx = "electric_shock" +target_anim = "electric_shock" target_hit = { offense = "range", defence = "magic", max = 150 } diff --git a/data/area/realm/killerwatt_plane/killerwatt_plane.drop.toml b/data/area/realm/killerwatt_plane/killerwatt_plane.drops.toml similarity index 100% rename from data/area/realm/killerwatt_plane/killerwatt_plane.drop.toml rename to data/area/realm/killerwatt_plane/killerwatt_plane.drops.toml diff --git a/data/area/realm/killerwatt_plane/killerwatt_plane.gfx.toml b/data/area/realm/killerwatt_plane/killerwatt_plane.gfx.toml new file mode 100644 index 0000000000..6e266117b5 --- /dev/null +++ b/data/area/realm/killerwatt_plane/killerwatt_plane.gfx.toml @@ -0,0 +1,2 @@ +[electric_shock] +id = 560 \ No newline at end of file diff --git a/data/area/realm/killerwatt_plane/killerwatt_plane.npcs.toml b/data/area/realm/killerwatt_plane/killerwatt_plane.npcs.toml index e12156318c..888654f25f 100644 --- a/data/area/realm/killerwatt_plane/killerwatt_plane.npcs.toml +++ b/data/area/realm/killerwatt_plane/killerwatt_plane.npcs.toml @@ -6,13 +6,18 @@ str = 50 def = 40 mage = 67 range = 67 -combat_def = "killerwatt" attack_bonus = 30 slayer_xp = 51.0 categories = ["killerwatts"] respawn_delay = 30 examine = "A ball of electrical energy." +[killerwatt_attacking] +id = 3201 +combat_def = "killerwatt" +drop_table = "killerwatt" +examine = "An angry electrical shock!" + [storm_cloud_killerwatt_plane] id = 3203 examine = "A very small storm!" diff --git a/data/area/wilderness/chaos_tunnels/chaos_tunnels.anims.toml b/data/area/wilderness/chaos_tunnels/chaos_tunnels.anims.toml index 7b7c890cd5..babe13b2b1 100644 --- a/data/area/wilderness/chaos_tunnels/chaos_tunnels.anims.toml +++ b/data/area/wilderness/chaos_tunnels/chaos_tunnels.anims.toml @@ -8,13 +8,13 @@ id = 1557 id = 1558 [leech_attack] -id = 2070 +id = 1273 [leech_defend] -id = 2072 +id = 1271 [leech_death] -id = 2073 +id = 1272 [giant_crypt_rat_attack] id = 4933 diff --git a/data/entity/npc/monster/vampyre/vampyre.anims.toml b/data/entity/npc/monster/vampyre/vampyre.anims.toml index 2246dc260d..a857362a7e 100644 --- a/data/entity/npc/monster/vampyre/vampyre.anims.toml +++ b/data/entity/npc/monster/vampyre/vampyre.anims.toml @@ -1,8 +1,11 @@ -[vampyre_god_wars_attack] +[vampyre_attack] id = 1264 +[vampyre_bite] +id = 1263 + [vampyre_god_wars_defend] id = 403 -[vampyre_god_wars_death] +[vampyre_death] id = 836 \ No newline at end of file diff --git a/data/entity/npc/monster/vampyre/vampyre.combat.toml b/data/entity/npc/monster/vampyre/vampyre.combat.toml index 5976d2bf13..0b53119cfe 100644 --- a/data/entity/npc/monster/vampyre/vampyre.combat.toml +++ b/data/entity/npc/monster/vampyre/vampyre.combat.toml @@ -3,12 +3,33 @@ attack_speed = 4 retreat_range = 8 defend_anim = "vampyre_god_wars_defend" defend_sound = "vampyre_defend" -death_anim = "vampyre_god_wars_death" +death_anim = "vampyre_death" death_sound = "vampyre_death" [vampyre_god_wars.melee] range = 1 -anim = "vampyre_god_wars_attack" +anim = "vampyre_attack" target_sound = "vampyre_attack" target_hit = { offense = "slash", max = 80 } +[vampyre] +attack_speed = 4 +retreat_range = 8 +defend_anim = "vampyre_defend" +defend_sound = "human_defend" +death_anim = "human_death" +death_sound = "vampyre_death" + +[vampyre.melee] +chance = 10 +range = 1 +anim = "vampyre_attack" +target_sound = "vampyre_attack" +target_hit = { offense = "stab", max = 70 } + +[vampyre.bite] +range = 1 +anim = "vampyre_bite" +target_sound = "vampyre_suck" +target_hit = { offense = "stab", max = 70 } + diff --git a/data/entity/npc/monster/vampyre/vampyre.sounds.toml b/data/entity/npc/monster/vampyre/vampyre.sounds.toml index 52c7353e93..9aefdaceac 100644 --- a/data/entity/npc/monster/vampyre/vampyre.sounds.toml +++ b/data/entity/npc/monster/vampyre/vampyre.sounds.toml @@ -4,5 +4,8 @@ id = 879 [vampyre_defend] id = 884 +[vampyre_suck] +id = 886 + [vampyre_death] id = 882 \ No newline at end of file diff --git a/data/entity/obj/door/door.objs.toml b/data/entity/obj/door/door.objs.toml index 59d85f7f7d..630219cf19 100644 --- a/data/entity/obj/door/door.objs.toml +++ b/data/entity/obj/door/door.objs.toml @@ -3834,14 +3834,6 @@ id = 46308 id = 46307 examine = "The entrance to the sawmill training area." -[large_door_118_opened] -id = 47425 -examine = "A large double door." - -[large_door_118_closed] -id = 47424 -examine = "A large double door." - [door_768_opened] id = 47444 examine = "The door is open." diff --git a/data/entity/obj/door/door.sounds.toml b/data/entity/obj/door/door.sounds.toml index fc5fc8083b..b1d06292fc 100644 --- a/data/entity/obj/door/door.sounds.toml +++ b/data/entity/obj/door/door.sounds.toml @@ -13,6 +13,9 @@ id = 71 [irondoor_locked] id = 72 +[big_door_close] +id = 45 + [gate_close] id = 66 diff --git a/data/skill/firemaking/light_source.tables.toml b/data/skill/firemaking/light_source.tables.toml index bd411f85f4..e530544c65 100644 --- a/data/skill/firemaking/light_source.tables.toml +++ b/data/skill/firemaking/light_source.tables.toml @@ -59,6 +59,11 @@ lit = "lit_torch" level = 1 type = "torch" +[.unlit_bug_lantern] +lit = "lit_bug_lantern" +level = 33 +type = "lantern" + [extinguish] row_id = "item" unlit = "item" @@ -95,3 +100,6 @@ unlit = "sapphire_lantern_oil" [.lit_torch] unlit = "unlit_torch" + +[.lit_bug_lantern] +unlit = "unlit_bug_lantern" diff --git a/data/skill/herblore/herblore.anims.toml b/data/skill/herblore/herblore.anims.toml index 57c91da7d0..93cca66282 100644 --- a/data/skill/herblore/herblore.anims.toml +++ b/data/skill/herblore/herblore.anims.toml @@ -1,4 +1,4 @@ -[overload] +[electric_shock] id = 3170 [mixing_potion] diff --git a/data/skill/slayer/master/chaeldar.tables.toml b/data/skill/slayer/master/chaeldar.tables.toml index 9984133f69..a51442cf73 100644 --- a/data/skill/slayer/master/chaeldar.tables.toml +++ b/data/skill/slayer/master/chaeldar.tables.toml @@ -73,10 +73,10 @@ amount = [70, 130] weight = 12 tip = "Like other giants, Fire giants often wield large weapons. Learn to recognise what kind of weapon it is and act accordingly. The smoke dungeon to the west of Pollnivneach has a population of these large and irritating creatures, so go smite them." -#[.fever_spiders] -#amount = [70, 130] -#weight = 7 -#tip = "Fever spiders are giant spiders that carry the deadly spider fever. If you don't want to catch it, I suggest you wear Slayer gloves to fight them. I've heard they cause problems in breweries, if you want to find some." +[.fever_spiders] +amount = [70, 130] +weight = 7 +tip = "Fever spiders are giant spiders that carry the deadly spider fever. If you don't want to catch it, I suggest you wear Slayer gloves to fight them. I've heard they cause problems in breweries, if you want to find some." [.gargoyles] amount = [70, 130] @@ -163,10 +163,10 @@ amount = [90, 150] weight = 8 tip = "Tzhaar reside in their cave under the Karamja volcano. Beware as they can call to their fellows for aid." -#[.vampyres] -#amount = [80, 100] -#weight = 6 -#tip = "Vampyres are extremely powerful beings. An underground group known as the Myreque have been searching for tools to defeat them, which they may be willing to share if you can find them." +[.vampyres] +amount = [80, 100] +weight = 6 +tip = "Vampyres are extremely powerful beings. An underground group known as the Myreque have been searching for tools to defeat them, which they may be willing to share if you can find them." #[.warped_creatures] #amount = [70, 130] diff --git a/data/skill/slayer/master/mazchna.tables.toml b/data/skill/slayer/master/mazchna.tables.toml index cbd09d9e19..84ace77aed 100644 --- a/data/skill/slayer/master/mazchna.tables.toml +++ b/data/skill/slayer/master/mazchna.tables.toml @@ -93,10 +93,10 @@ amount = [30, 50] weight = 6 tip = "Kalphite are large insects which live in great hives under the desert sands." -#[.killerwatts] -#amount = [30, 50] -#weight = 6 -#tip = "Killerwatts store huge amounts of energy in their bodies, which is released if they are touched. You'll need to wear heavily insulated boots to counter this shocking effect, plus they can attack speedily with both magic and missiles. To access their cloudy plane, you'll need to explore Draynor Manor." +[.killerwatts] +amount = [30, 50] +weight = 6 +tip = "Killerwatts store huge amounts of energy in their bodies, which is released if they are touched. You'll need to wear heavily insulated boots to counter this shocking effect, plus they can attack speedily with both magic and missiles. To access their cloudy plane, you'll need to explore Draynor Manor." [.lizards] amount = [30, 50] @@ -133,10 +133,10 @@ amount = [30, 50] weight = 7 tip = "Skeletons are undead so magic is your best bet against them, there is even a spell specially for fighting the undead." -#[.vampyres] -#amount = [10, 20] -#weight = 6 -#tip = "Vampyres are extremely powerful beings. They feed on the blood of the living, so watch that you don't get bitten. Look in the woods of Morytania." +[.vampyres] +amount = [10, 20] +weight = 6 +tip = "Vampyres are extremely powerful beings. They feed on the blood of the living, so watch that you don't get bitten. Look in the woods of Morytania." [.wolves] amount = [30, 50] diff --git a/data/skill/slayer/master/vannaka.tables.toml b/data/skill/slayer/master/vannaka.tables.toml index 1d51b900ef..572eebfffb 100644 --- a/data/skill/slayer/master/vannaka.tables.toml +++ b/data/skill/slayer/master/vannaka.tables.toml @@ -73,10 +73,10 @@ amount = [40, 90] weight = 7 tip = "Like other giants, Fire Giants have little to no magical ability, and they're particularly weak to water spells." -#[.fever_spiders] -#amount = [30, 90] -#weight = 7 -#tip = "Fever Spiders are giant spiders that carry the deadly Spider Fever. If you don't want to catch it I suggest you wear Slayer Gloves to fight them." +[.fever_spiders] +amount = [30, 90] +weight = 7 +tip = "Fever Spiders are giant spiders that carry the deadly Spider Fever. If you don't want to catch it I suggest you wear Slayer Gloves to fight them." [.gargoyles] amount = [40, 90] @@ -103,10 +103,10 @@ amount = [40, 90] weight = 7 tip = "Hobgoblins are larger and stronger then their brethren. There is a peninsula, south-west of Falador, where these creatures have a hideout." -#[.harpie_bug_swarms] -#amount = [40, 90] -#weight = 8 -#tip = "Harpie Bug Swarms are pesky critters that are hard to hit. You need a lit bug lantern to distract them with its hypnotic light." +[.harpie_bug_swarms] +amount = [40, 90] +weight = 8 +tip = "Harpie Bug Swarms are pesky critters that are hard to hit. You need a lit bug lantern to distract them with its hypnotic light." [.infernal_mage] amount = [40, 90] @@ -208,10 +208,10 @@ amount = [40, 90] weight = 7 tip = "Trolls regenerate damage quickly and have some level of magical defences, but this is easily bypassed by their weakness to fire." -#[.vampyres] -#amount = [10, 20] -#weight = 7 -#tip = "Vampyres are extremely powerful beings. An underground group known as the Myreque have been searching for tools to defeat them, which they may be willing to share if you can find them." +[.vampyres] +amount = [10, 20] +weight = 7 +tip = "Vampyres are extremely powerful beings. An underground group known as the Myreque have been searching for tools to defeat them, which they may be willing to share if you can find them." [.werewolves] amount = [30, 60] diff --git a/data/skill/slayer/slayer.items.toml b/data/skill/slayer/slayer.items.toml index 58e7d8ec88..3cb2bc4f2a 100644 --- a/data/skill/slayer/slayer.items.toml +++ b/data/skill/slayer/slayer.items.toml @@ -219,8 +219,9 @@ limit = 100 tradeable = false weight = 2.267 slot = "Shield" -examine = "A lantern to aid attacking Harpie bugs." +aka = ["bug_lantern"] kept = "Reclaim" +examine = "A lantern to aid attacking Harpie bugs." [insulated_boots] id = 7159 diff --git a/data/skill/slayer/slayer.tables.toml b/data/skill/slayer/slayer.tables.toml index 9680f81cc9..5ec893f803 100644 --- a/data/skill/slayer/slayer.tables.toml +++ b/data/skill/slayer/slayer.tables.toml @@ -1,7 +1,7 @@ [slayer_tasks] npc = "npc" combat_level = "int" -defence_level = "int" +skill = "pair" quest = "string" variable = "string" tip = "string" @@ -92,7 +92,7 @@ combat_level = 15 [.cockatrice] npc = "cockatrice" combat_level = 25 -defence_level = 20 +skill = ["defence", 20] [.cows] npc = "cow_default" @@ -151,6 +151,7 @@ combat_level = 15 [.fever_spiders] npc = "fever_spider" +quest = "rum_deal" [.frost_dragons] npc = "frost_dragon" @@ -193,6 +194,7 @@ combat_level = 20 [.harpie_bug_swarms] npc = "harpie_bug_swarm" +skill = ["firemaking", 33] [.infernal_mage] npc = "infernal_mage" @@ -361,7 +363,7 @@ combat_level = 20 [.wall_beasts] npc = "wall_beast" combat_level = 30 -defence_level = 5 +skill = ["defence", 5] [.warped_creatures] npc = "warped_terrorbird" diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/data/config/CombatDefinition.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/data/config/CombatDefinition.kt index 6e81a209e0..e79d387941 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/data/config/CombatDefinition.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/data/config/CombatDefinition.kt @@ -101,6 +101,7 @@ data class CombatDefinition( val impactDrainSkills: List = emptyList(), val impactFreeze: Int = 0, val impactPoison: Int = 0, + val impactDisease: Int = 0, val impactMessage: String = "", ) { companion object { diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/CombatDefinitions.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/CombatDefinitions.kt index e5e7f96bd3..917529fa86 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/CombatDefinitions.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/CombatDefinitions.kt @@ -119,6 +119,7 @@ class CombatDefinitions { var impactRegardless = false var freeze = 0 var poison = 0 + var disease = 0 var message = "" val definition = definitions.getOrPut(stringId) { CombatDefinition(npc = stringId) } val attacks = definition.attacks as MutableMap @@ -173,6 +174,7 @@ class CombatDefinitions { "impact_regardless" -> impactRegardless = boolean() "impact_freeze" -> freeze = int() "impact_poison" -> poison = int() + "impact_disease" -> disease = int() "impact_message" -> message = string() "miss_gfx" -> graphic(missGraphics) "miss_gfxs" -> graphics(missGraphics) @@ -212,6 +214,7 @@ class CombatDefinitions { impactDrainSkills = drainSkills, impactFreeze = freeze, impactPoison = poison, + impactDisease = disease, impactMessage = message, ) } diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/Tables.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/Tables.kt index 2f508b779e..f10ee0d662 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/Tables.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/Tables.kt @@ -194,7 +194,7 @@ object Tables { private fun getOrNull(path: String, type: ColumnType): T? { val (table, row, column) = path.split(".") - val id = Rows.ids["${table}.${row}"] ?: error("Row '$row' not found for $path") + val id = Rows.ids["${table}.${row}"] ?: return null return getOrNull(table, column, id, type) } diff --git a/game/src/main/kotlin/content/area/misthalin/draynor_village/manor/DraynorManor.kt b/game/src/main/kotlin/content/area/misthalin/draynor_village/manor/DraynorManor.kt new file mode 100644 index 0000000000..9fb9720d98 --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/draynor_village/manor/DraynorManor.kt @@ -0,0 +1,20 @@ +package content.area.misthalin.draynor_village.manor + +import content.entity.obj.door.enterDoor +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.entity.character.sound + +class DraynorManor : Script { + init { + objectOperate("Open", "draynor_manor_door_sign_closed,draynor_manor_door_closed") { (target) -> + if (tile.y >= 3354) { + message("The doors won't open.") + return@objectOperate + } + enterDoor(target) + message("The doors slam shut behind you.") + sound("big_door_close") + } + } +} diff --git a/game/src/main/kotlin/content/area/misthalin/draynor_village/manor/Killerwatt.kt b/game/src/main/kotlin/content/area/misthalin/draynor_village/manor/Killerwatt.kt new file mode 100644 index 0000000000..dfc5574e99 --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/draynor_village/manor/Killerwatt.kt @@ -0,0 +1,17 @@ +package content.area.misthalin.draynor_village.manor + +import content.entity.effect.transform +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.entity.character.areaSound + +class Killerwatt : Script { + init { + npcCombatDamage("killerwatt") { (source) -> + if (transform != "") { + return@npcCombatDamage + } + areaSound("killerwatt_transforms", tile, radius = 5) + transform("killerwatt_attacking") + } + } +} diff --git a/game/src/main/kotlin/content/area/misthalin/draynor_village/manor/ProfessorOddenstein.kt b/game/src/main/kotlin/content/area/misthalin/draynor_village/manor/ProfessorOddenstein.kt new file mode 100644 index 0000000000..fa73b9ea12 --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/draynor_village/manor/ProfessorOddenstein.kt @@ -0,0 +1,55 @@ +package content.area.misthalin.draynor_village.manor + +import content.entity.player.dialogue.Confused +import content.entity.player.dialogue.Neutral +import content.entity.player.dialogue.Quiz +import content.entity.player.dialogue.type.choice +import content.entity.player.dialogue.type.npc +import content.entity.player.dialogue.type.player +import content.quest.questCompleted +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.entity.character.move.tele + +class ProfessorOddenstein : Script { + init { + npcOperate("Talk-to", "professor_oddenstein") { (target) -> + if (!questCompleted("ernest_the_chicken")) { + // TODO quest + npc("Be careful in here, there's lots of dangerous equipment.") + choice { + option("What does this machine do?") { + npc("Nothing at the moment... It's broken. It's meant to be a transmutation machine.") + npc("It has also spent time as a time travel machine, and a dramatic lightning generator, and a thing for generating monsters.") + } + option("Is this your house?") { + npc("No, I'm just one of the tenants. It belongs to the count who lives in the basement.") + } + } + return@npcOperate + } + // TODO on enter portal without boots + npc("Errr, just before you go through there...") + player("What's the problem?") + npc("That portal opens into a plane populated with some very shocking creatures. You should wear some kind of insulated armour before going there.") + choice { + option("Where can I get insulated armour from?") { + npc("Well there were some pretty tough people here last week. Said they were Slayer Masters. They were planning on making some protective boots. You should speak to one of them.") + choice { + option("Thanks, I'll do that.") { + npc("No problem. See you later.") + } + option("I don't want to run around after Slayer Masters, I'm going through.") { + tele(2677, 5214, 2) + } + } + } + option("Thanks, I think I'll stay here for a while then.") + option("Thanks for the warning, but I'm not scared of any monster.") { + player("Thanks for the warning, but I'm not scared of any monster.") + npc("Ok. Just don't say I didn't warn you") + tele(2677, 5214, 2) + } + } + } + } +} diff --git a/game/src/main/kotlin/content/area/morytania/braindeath_island/Brewer.kt b/game/src/main/kotlin/content/area/morytania/braindeath_island/Brewer.kt new file mode 100644 index 0000000000..86d41ec658 --- /dev/null +++ b/game/src/main/kotlin/content/area/morytania/braindeath_island/Brewer.kt @@ -0,0 +1,113 @@ +package content.area.morytania.braindeath_island + +import content.entity.player.dialogue.Angry +import content.entity.player.dialogue.Drunk +import content.entity.player.dialogue.Happy +import content.entity.player.dialogue.Laugh +import content.entity.player.dialogue.Neutral +import content.entity.player.dialogue.Quiz +import content.entity.player.dialogue.Scared +import content.entity.player.dialogue.Shifty +import content.entity.player.dialogue.Shock +import content.entity.player.dialogue.type.npc +import content.entity.player.dialogue.type.player +import content.quest.questCompleted +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.entity.Despawn.Companion.player + +class Brewer : Script { + init { + npcOperate("Talk-to", "brewer") { + if (!questCompleted("rum_deal")) { + return@npcOperate + } + player("Hello there!") + npc("I don't know what your game is, but I know you're one of THEM!") + player("But I just saved you!") + npc("The voices tell me different. It's all part of a plot! Confess!") + } + + npcOperate("Talk-to", "brewer_2") { + if (!questCompleted("rum_deal")) { + return@npcOperate + } + player("Hello there!") + npc("Have they gone yet?") + player("Well, no, but they are a lot calmer now.") + npc("What are we gonna do now, huh? What are we gunna do now?") + player("In your case I would say relax.") + } + + npcOperate("Talk-to", "brewer_3") { + if (!questCompleted("rum_deal")) { + return@npcOperate + } + player("Hello there!") + npc("Hello yourself!") + player("How's things?") + npc("Fine...") + player("Excellent! Since I get the feeling I don't want to know why you said that so oddly I'll just go over here!") + npc("I think that would be for the best!") + } + + npcOperate("Talk-to", "brewer_4") { + if (!questCompleted("rum_deal")) { + return@npcOperate + } + player("Hello there!") + npc("Hello yerself Landlubber!") + player("Everything ok with you now?") + npc("Hmmm...Overall everything is good!") + player("Great!") + } + + npcOperate("Talk-to", "brewer_5") { + if (!questCompleted("rum_deal")) { + return@npcOperate + } + player("Hello there!") + npc("Hello there, brave hero, in whom I had total confidence!") + player("Total confidence?") + npc("Yes! I was so confident that I would never, ever have sold your soft, edible body to the pirates outside!") + player("Well, great...") + npc("On a completely unrelated note, I would steer clear of Hungry Frank for a while.") + npc("He's a filthy liar. And a forger. It wouldn't surprise me if he has written out a note detailing the terms of our surrender and your dismemberment and cooking in MY handwriting.") + npc("Imagine that, the fiend.") + } + + npcOperate("Talk-to", "brewer_6") { + if (!questCompleted("rum_deal")) { + return@npcOperate + } + player("So...got any sleep yet?") + npc("My brain is no longer capable of sleep.") + player("So...what are you going to do now?") + npc("I was gonna try and will myself dead.") + player("Right...good luck with that.") + } + + npcOperate("Talk-to", "brewer_7") { + if (!questCompleted("rum_deal")) { + return@npcOperate + } + player("Hello there!") + npc("Well you proved that you're probably not a zombie.") + npc("So what are you then? A ghoul? A vampyre?") + player("I'm not any form of undead!") + npc("Oh...oh god I'm sorry, I didn't realise it was natural...") + player("What?") + npc("Nothing...") + } + + npcOperate("Talk-to", "brewer_8") { + if (!questCompleted("rum_deal")) { + return@npcOperate + } + player("Hello there!") + npc("You saved us! Huzzah!") + player("All in a day's work, think nothing of it.") + npc("I don't have anything to reward you with except my collection of bleak, gothic poetry I wrote when I assumed we were all done for. Do you want it?") + player("I may come for it later, you hang on to it for now.") + } + } +} diff --git a/game/src/main/kotlin/content/area/morytania/braindeath_island/CaptainDonnie.kt b/game/src/main/kotlin/content/area/morytania/braindeath_island/CaptainDonnie.kt new file mode 100644 index 0000000000..c758f36efd --- /dev/null +++ b/game/src/main/kotlin/content/area/morytania/braindeath_island/CaptainDonnie.kt @@ -0,0 +1,30 @@ +package content.area.morytania.braindeath_island + +import content.entity.player.dialogue.Drunk +import content.entity.player.dialogue.Quiz +import content.entity.player.dialogue.Shifty +import content.entity.player.dialogue.type.npc +import content.entity.player.dialogue.type.player +import content.quest.questCompleted +import world.gregs.voidps.engine.Script + +class CaptainDonnie : Script { + init { + npcOperate("Talk-to", "captain_donnie") { + if (!questCompleted("rum_deal")) { + return@npcOperate + } + npc("Hey! You!") + player("Who? Me?") + npc("Aye! Ye!") + npc("Got any more rum?") + player("What happens if I don't?") + npc("Then I'll clap ye in Runes!") + player("Don't you mean clap me in irons?") + npc("No lad, not irons, Runes!") + npc("We upgraded last week.") + player("Ok, well it's a good job that I have some over here isn't it?") + npc("Arr, yer a good lad...") + } + } +} diff --git a/game/src/main/kotlin/content/area/morytania/braindeath_island/FeverSpider.kt b/game/src/main/kotlin/content/area/morytania/braindeath_island/FeverSpider.kt new file mode 100644 index 0000000000..985dc276b8 --- /dev/null +++ b/game/src/main/kotlin/content/area/morytania/braindeath_island/FeverSpider.kt @@ -0,0 +1,19 @@ +package content.area.morytania.braindeath_island + +import content.entity.combat.hit.damage +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.entity.character.player.Player +import world.gregs.voidps.engine.entity.character.player.equip.equipped +import world.gregs.voidps.engine.entity.character.player.skill.Skill +import world.gregs.voidps.network.login.protocol.visual.update.player.EquipSlot + +class FeverSpider : Script { + init { + npcCondition("slayer_gloves") { it is Player && it.equipped(EquipSlot.Hands).id == "slayer_gloves" } + npcCondition("no_slayer_gloves") { it is Player && it.equipped(EquipSlot.Hands).id != "slayer_gloves" } + npcAttack("fever_spider", "disease") { + val damage = (it.levels.get(Skill.Constitution) / 100.0) * 12.5 + it.damage(damage.toInt()) + } + } +} diff --git a/game/src/main/kotlin/content/area/morytania/braindeath_island/ZombieProtester.kt b/game/src/main/kotlin/content/area/morytania/braindeath_island/ZombieProtester.kt new file mode 100644 index 0000000000..a816d03a72 --- /dev/null +++ b/game/src/main/kotlin/content/area/morytania/braindeath_island/ZombieProtester.kt @@ -0,0 +1,58 @@ +package content.area.morytania.braindeath_island + +import content.entity.player.dialogue.Drunk +import content.entity.player.dialogue.Shifty +import content.entity.player.dialogue.type.npc +import content.entity.player.dialogue.type.player +import content.quest.questCompleted +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.entity.character.mode.Follow +import world.gregs.voidps.engine.timer.Timer +import world.gregs.voidps.engine.timer.toTicks +import world.gregs.voidps.type.random +import java.util.concurrent.TimeUnit + +class ZombieProtester : Script { + init { + + huntPlayer("zombie_protester*", "spotted") { + if (!tile.within(it.tile, 4)) { + return@huntPlayer + } + softTimers.start("protesting") + mode = Follow(this, it) + } + + npcOperate("Talk-to", "zombie_protester*") { + if (!questCompleted("rum_deal")) { + return@npcOperate + } + npc("Arrrr! Tis yerself! Have a drink!") + player("Errr...Arrr! I will in a sec, I've just go to, err, plunder some landlubbers...") + npc("Good huntin'!") + } + + npcTimerStart("protesting") { TimeUnit.SECONDS.toTicks(30) } + + npcTimerTick("protesting") { + say( + when (random.nextInt(8)) { + 0 -> "Whadda we want? Rum!" + 1 -> "Give us rum or give us death!" + 2 -> "Give us yer rum, ye scurvy dog!" + 3 -> "Yer rum or yer brains!" + 4 -> "When do we want it? Now!" + 5 -> "Where d'ye think yer goin?" + 6 -> "Ye'll never beat us all!" + 7 -> "United we stagger!" + else -> "Rum, rum, we want rum!" + }, + ) + if (mode is Follow) { + Timer.CONTINUE + } else { + Timer.CANCEL + } + } + } +} diff --git a/game/src/main/kotlin/content/area/morytania/mort_myre_swamp/FeralVampyre.kt b/game/src/main/kotlin/content/area/morytania/mort_myre_swamp/FeralVampyre.kt new file mode 100644 index 0000000000..973046a6e1 --- /dev/null +++ b/game/src/main/kotlin/content/area/morytania/mort_myre_swamp/FeralVampyre.kt @@ -0,0 +1,34 @@ +package content.area.morytania.mort_myre_swamp + +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.entity.character.player.Player +import world.gregs.voidps.engine.entity.character.player.equip.equipped +import world.gregs.voidps.engine.entity.character.player.skill.Skill +import world.gregs.voidps.network.login.protocol.visual.update.player.EquipSlot +import world.gregs.voidps.type.random + +class FeralVampyre : Script { + init { + npcAttack("vampyre", "bite") { target -> + levels.restore(Skill.Constitution, 10) // TODO unknown how much exactly, drains? + if (target !is Player) { + return@npcAttack + } + if (target.equipped(EquipSlot.Amulet).id != "holy_symbol") { + return@npcAttack + } + if (levels.getOffset(Skill.Attack) != 0) { + return@npcAttack + } + if (random.nextInt(20) != 0) { + return@npcAttack + } + levels.drain(Skill.Attack, multiplier = 0.25) + levels.drain(Skill.Strength, multiplier = 0.25) + levels.drain(Skill.Defence, multiplier = 0.25) + levels.drain(Skill.Magic, multiplier = 0.25) + target.message("The vampyre is weakened by your holy symbol of Saradomin.") + } + } +} diff --git a/game/src/main/kotlin/content/area/morytania/port_phasmatys/PiratePete.kt b/game/src/main/kotlin/content/area/morytania/port_phasmatys/PiratePete.kt new file mode 100644 index 0000000000..33c0ff80a1 --- /dev/null +++ b/game/src/main/kotlin/content/area/morytania/port_phasmatys/PiratePete.kt @@ -0,0 +1,118 @@ +package content.area.morytania.port_phasmatys + +import content.entity.player.dialogue.Angry +import content.entity.player.dialogue.Drunk +import content.entity.player.dialogue.Happy +import content.entity.player.dialogue.Neutral +import content.entity.player.dialogue.Quiz +import content.entity.player.dialogue.Sad +import content.entity.player.dialogue.Shifty +import content.entity.player.dialogue.Shock +import content.entity.player.dialogue.type.choice +import content.entity.player.dialogue.type.npc +import content.entity.player.dialogue.type.player +import content.quest.questCompleted +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.client.ui.open +import world.gregs.voidps.engine.entity.character.move.tele +import world.gregs.voidps.engine.entity.character.npc.NPC +import world.gregs.voidps.engine.entity.character.player.Player +import world.gregs.voidps.engine.entity.character.sound +import world.gregs.voidps.type.Direction +import world.gregs.voidps.type.Tile +import world.gregs.voidps.type.random + +class PiratePete : Script { + init { + npcOperate("Talk-to", "pirate_pete*") { (target) -> + if (!questCompleted("rum_deal")) { + player("Hello there!") + npc("Mornin'.") + player("Got any quests?") + npc("I may have a quest, but you don't look like you'd be able handle the kind of monsters I have problems with.") + return@npcOperate + } + player("Do I know you?") + npc("Yes, you owe me some money.") + if (target.id == "pirate_pete_braindeath_island") { + npc("Want a lift to Port Phasmatys?") + } else { + npc("Want a lift to Braindeath Island?") + player("Well, possibly, but could I go to Mos Le'Harmless instead?") + npc("Nope. It's Braindeath island or nothing. Interested?") + } + choice { + option("Okay!") { + if (target.id == "pirate_pete_braindeath_island") { + travel(target, Tile(3680, 3536)) + } else { + travel(target, Tile(2162, 5114, 1)) + } + } + option("Not now") { + player("I'm getting an awful headache talking to you. Any idea why?") + npc("No idea whatsoever.") + } + option("Why do I get a headache every time I see you?") { + npc("Well, it's possibly the weight of all of your expensive items giving you a sore back.") + npc("As a doctor I can tell you that sometimes a bad back can manifest as a headache.") + player("You're a doctor?") + npc("I'm on a break.") + npc("Regardless, I can tell you that if you hand me your most expensive items, then the pain will disappear.") + npc("CoughonceyouturnaroundagainCough!") + } + option("Are you any relation to Party Pete?") { + npc("Yes I am, he's my cousin.") + player("Well, you don't sound too happy about it. What happened?") + npc("Well, I arranged with all my friends to have a party at his place.") + npc("But then I humiliated myself by trying to dance with the knights.") + npc("All of them collapsed on me in a horrific, jangling pile.") + npc("I tried to salvage the night by having all the balloons come down...") + player("So what happened?") + npc("I didn't know that someone had swapped the balloons with cannonballs!") + npc("The casualties were horrific...") + npc("That was the worst fifth birthday party in the history of the world.") + player("I'm sure it wasn't that bad.") + npc("Not according to the Official History of Gielinor!") + npc("Every edition... the pictures bring it all back...") + player("Ouch...") + } + } + } + } + + private suspend fun Player.travel(target: NPC, tile: Tile) { + if (random.nextBoolean()) { + npc("Err... sure...") + player("Why are you looking over my shoulder?") + } else { + npc("Well I'll be more than happy to...") + npc("Egad! Did you see that?") + player("What? Where?") + } + face(Direction.SOUTH) + delay(2) + say("Ow!") + target.anim("mace_pummel") + gfx("stun_long", delay = 20) + open("fade_out") + sound("cudgel", delay = 15) + delay(3) + tele(tile) + delay(3) + open("fade_in") + face(Direction.NORTH) + delay(2) + player("Ooooh... my head...") + npc("Are you ok? You, errr...") + when (random.nextInt(3)) { + 0 -> npc("...missed your mouth while drinking from a bottle. Hence the bottle-shaped bruises.") + 1 -> { + npc("...hit your head on my oars while I was rowing over.") + npc("Twice.") + } + else -> npc("...slipped and fell down some stairs.") + } + player("Wow... I'm lucky I wasn't seriously hurt!") + } +} diff --git a/game/src/main/kotlin/content/area/morytania/port_phasmatys/TorturedSoul.kt b/game/src/main/kotlin/content/area/morytania/port_phasmatys/TorturedSoul.kt new file mode 100644 index 0000000000..257ff262aa --- /dev/null +++ b/game/src/main/kotlin/content/area/morytania/port_phasmatys/TorturedSoul.kt @@ -0,0 +1,18 @@ +package content.area.morytania.port_phasmatys + +import world.gregs.voidps.engine.Script +import world.gregs.voidps.type.random + +class TorturedSoul : Script { + init { + npcDeath("tortured_soul") { + say( + when (random.nextInt(3)) { + 0 -> "Your soul will be forfeit for this, mortal!" + 1 -> "I will return, mortal!" + else -> "You cannot kill the undead, mortal!" + }, + ) + } + } +} diff --git a/game/src/main/kotlin/content/entity/combat/Target.kt b/game/src/main/kotlin/content/entity/combat/Target.kt index 88e3ebc54d..328a61d238 100644 --- a/game/src/main/kotlin/content/entity/combat/Target.kt +++ b/game/src/main/kotlin/content/entity/combat/Target.kt @@ -167,6 +167,7 @@ object Target { Hit.meleeType(type) && !weapon.id.startsWith("leaf_bladed") -> 0 else -> damage } + is NPC if target.id == "harpie_bug_swarm" && source is Player && source.equipped(EquipSlot.Shield).id != "lit_bug_lantern" -> 0 is NPC if target.def.contains("damage_cap") -> damage.coerceAtMost(target.def["damage_cap"]) is NPC if target.def.contains("immune_death") -> damage.coerceAtMost(target.levels.get(Skill.Constitution) - 10) else -> damage diff --git a/game/src/main/kotlin/content/entity/npc/combat/Attack.kt b/game/src/main/kotlin/content/entity/npc/combat/Attack.kt index bcc2a6be67..97d0883249 100644 --- a/game/src/main/kotlin/content/entity/npc/combat/Attack.kt +++ b/game/src/main/kotlin/content/entity/npc/combat/Attack.kt @@ -5,6 +5,7 @@ import content.entity.combat.hit.Hit import content.entity.combat.hit.hit import content.entity.death.weightedSample import content.entity.effect.freeze +import content.entity.effect.toxin.disease import content.entity.effect.toxin.poison import content.entity.gfx.areaGfx import content.entity.proj.shoot @@ -155,6 +156,9 @@ class Attack( if (attack.impactPoison != 0) { poison(target, attack.impactPoison) } + if (attack.impactDisease != 0) { + disease(target, attack.impactDisease) + } if (attack.impactMessage != "") { target.message(attack.impactMessage) } diff --git a/game/src/main/kotlin/content/skill/constitution/drink/Overload.kt b/game/src/main/kotlin/content/skill/constitution/drink/Overload.kt index e72625307a..1e896b4585 100644 --- a/game/src/main/kotlin/content/skill/constitution/drink/Overload.kt +++ b/game/src/main/kotlin/content/skill/constitution/drink/Overload.kt @@ -71,7 +71,7 @@ class Overload : Script { repeat(5) { player.directHit(100) player.anim("overload") - player.gfx("overload") + player.gfx("electric_shock") pause(2) } } diff --git a/game/src/main/kotlin/content/skill/firemaking/LightSource.kt b/game/src/main/kotlin/content/skill/firemaking/LightSource.kt index 7a405d7b57..da4ca6b91f 100644 --- a/game/src/main/kotlin/content/skill/firemaking/LightSource.kt +++ b/game/src/main/kotlin/content/skill/firemaking/LightSource.kt @@ -13,6 +13,7 @@ import world.gregs.voidps.engine.inv.replace class LightSource : Script { init { val unlitSources = Tables.get("light_source").rows().joinToString(",") { it.itemId } + itemOnItem("tinderbox*", unlitSources) { _, toItem -> val source = Rows.getOrNull("light_source.${toItem.id}") ?: return@itemOnItem if (!has(Skill.Firemaking, source.int("level"), true)) { @@ -25,7 +26,7 @@ class LightSource : Script { } itemOption("Extinguish") { (item) -> - val extinguished = Tables.itemOrNull("extinguish.${item.id}") ?: return@itemOption + val extinguished = Tables.itemOrNull("extinguish.${item.id}.unlit") ?: return@itemOption if (!inventory.replace(item.id, extinguished)) { return@itemOption } diff --git a/game/src/main/kotlin/content/skill/slayer/Slayer.kt b/game/src/main/kotlin/content/skill/slayer/Slayer.kt index b8e37a6c56..1c5bb18f59 100644 --- a/game/src/main/kotlin/content/skill/slayer/Slayer.kt +++ b/game/src/main/kotlin/content/skill/slayer/Slayer.kt @@ -112,6 +112,10 @@ private fun hasRequirements(player: Player, table: TableDefinition, row: Int): B if (player.combatLevel < combatLevel) { return false } + val pair = Tables.skillPairOrNull("slayer_tasks.$category.skill") + if (pair != null && !player.has(pair.first, pair.second)) { + return false + } val variable = Tables.stringOrNull("slayer_tasks.$category.variable") if (variable != null && !player.contains(variable)) { return false