diff --git a/data/area/misthalin/barbarian_village/barbarian_village.npc-spawns.toml b/data/area/misthalin/barbarian_village/barbarian_village.npc-spawns.toml index 7aa91c62a8..d64a90c9ec 100644 --- a/data/area/misthalin/barbarian_village/barbarian_village.npc-spawns.toml +++ b/data/area/misthalin/barbarian_village/barbarian_village.npc-spawns.toml @@ -58,10 +58,10 @@ spawns = [ { id = "baby_raccoon_grey", x = 3055, y = 3432, members = true }, { id = "baby_raccoon_grey", x = 3059, y = 3421, members = true }, { id = "baby_raccoon_grey", x = 3061, y = 3429, members = true }, - { id = "student_barbarian_village", x = 3081, y = 3455, direction = "NORTH" }, - { id = "student_barbarian_village_2", x = 3081, y = 3453, direction = "NORTH" }, - { id = "student_barbarian_village_3", x = 3079, y = 3455, direction = "NORTH" }, - { id = "student_barbarian_village_4", x = 3077, y = 3453, direction = "NORTH" }, + { id = "student_barbarian_village", x = 3081, y = 3455, direction = "EAST" }, + { id = "student_barbarian_village_2", x = 3081, y = 3453, direction = "EAST" }, + { id = "student_barbarian_village_3", x = 3079, y = 3455, direction = "EAST" }, + { id = "student_barbarian_village_4", x = 3077, y = 3453, direction = "EAST" }, { id = "lakki_the_delivery_dwarf", x = 3008, y = 3434, members = true }, { id = "unicorn", x = 3090, y = 3450 }, ] \ No newline at end of file diff --git a/data/area/misthalin/barbarian_village/stronghold_of_player_safety/stronghold_of_player_safety.npc-spawns.toml b/data/area/misthalin/barbarian_village/stronghold_of_player_safety/stronghold_of_player_safety.npc-spawns.toml index 1b364269ec..1146df3c83 100644 --- a/data/area/misthalin/barbarian_village/stronghold_of_player_safety/stronghold_of_player_safety.npc-spawns.toml +++ b/data/area/misthalin/barbarian_village/stronghold_of_player_safety/stronghold_of_player_safety.npc-spawns.toml @@ -1,12 +1,12 @@ spawns = [ { id = "guard_stronghold_of_player_safety", x = 3083, y = 4246 }, - { id = "gublinch_jailmate_stronghold_of_player_safety", x = 3085, y = 4230 }, - { id = "gublinchette_jailmate_stronghold_of_player_safety", x = 3081, y = 4252 }, - { id = "gublinchette_jailmate_stronghold_of_player_safety_2", x = 3078, y = 4240 }, - { id = "gublinch_jailmate_stronghold_of_player_safety_2", x = 3079, y = 4245 }, - { id = "gublinch_jailmate_stronghold_of_player_safety_3", x = 3077, y = 4229 }, - { id = "gublinch_jailmate_stronghold_of_player_safety_4", x = 3085, y = 4235 }, - { id = "gublinch_jailmate_stronghold_of_player_safety_5", x = 3085, y = 4240 }, + { id = "gublinch_jailmate_stronghold_of_player_safety", x = 3085, y = 4230, direction = "WEST" }, + { id = "gublinchette_jailmate_stronghold_of_player_safety", x = 3081, y = 4252, direction = "SOUTH_EAST" }, + { id = "gublinchette_jailmate_stronghold_of_player_safety_2", x = 3078, y = 4240, direction = "EAST" }, + { id = "gublinch_jailmate_stronghold_of_player_safety_2", x = 3079, y = 4245, direction = "EAST" }, + { id = "gublinch_jailmate_stronghold_of_player_safety_3", x = 3077, y = 4229, direction = "EAST" }, + { id = "gublinch_jailmate_stronghold_of_player_safety_4", x = 3085, y = 4235, direction = "EAST" }, + { id = "gublinch_jailmate_stronghold_of_player_safety_5", x = 3085, y = 4240, direction = "WEST" }, { id = "cockroach_drone", x = 3142, y = 4240, level = 1 }, { id = "cockroach_drone", x = 3143, y = 4231, level = 1 }, { id = "cockroach_drone", x = 3143, y = 4236, level = 1 }, diff --git a/data/area/misthalin/barbarian_village/stronghold_of_player_safety/stronghold_of_player_safety.npcs.toml b/data/area/misthalin/barbarian_village/stronghold_of_player_safety/stronghold_of_player_safety.npcs.toml index c295537eca..196c135c78 100644 --- a/data/area/misthalin/barbarian_village/stronghold_of_player_safety/stronghold_of_player_safety.npcs.toml +++ b/data/area/misthalin/barbarian_village/stronghold_of_player_safety/stronghold_of_player_safety.npcs.toml @@ -32,13 +32,28 @@ examine = "An imprisoned gublinch." [cockroach_worker] id = 7159 +hitpoints = 540 +att = 22 +str = 22 +def = 22 categories = ["cockroaches"] examine = "Eurgh! A big bug." +respawn_delay = 60 +combat_def = "cockroach_worker" +drop_table = "cockroach_worker" [cockroach_soldier] id = 7160 +hitpoints = 960 +att = 50 +str = 50 +def = 50 +range = 50 categories = ["cockroaches"] examine = "Euww! A giant bug." +respawn_delay = 60 +drop_table = "cockroach_soldier" +combat_def = "cockroach_soldier" [mugger_stronghold_of_player_safety] id = 7161 @@ -47,8 +62,7 @@ att = 5 str = 5 def = 5 style = "crush" -max_hit_melee = 10 -hunt_mode = "cowardly" +combat_def = "mugger" drop_table = "mugger" examine = "He jumps out and attacks people." diff --git a/data/area/misthalin/edgeville/edgeville.npc-spawns.toml b/data/area/misthalin/edgeville/edgeville.npc-spawns.toml index 7083555706..6757fd0e38 100644 --- a/data/area/misthalin/edgeville/edgeville.npc-spawns.toml +++ b/data/area/misthalin/edgeville/edgeville.npc-spawns.toml @@ -65,8 +65,8 @@ spawns = [ { id = "imp", x = 3073, y = 3498 }, { id = "imp", x = 3078, y = 3499 }, { id = "professor_henry", x = 3084, y = 3458 }, - { id = "student_edgeville", x = 3079, y = 3457 }, - { id = "student_edgeville_2", x = 3077, y = 3457 }, + { id = "student_edgeville", x = 3079, y = 3457, direction = "EAST" }, + { id = "student_edgeville_2", x = 3077, y = 3457, direction = "EAST" }, { id = "cockroach_drone", x = 3077, y = 3461 }, { id = "cockroach_drone", x = 3078, y = 3464 }, { id = "oracle", x = 3013, y = 3501 }, diff --git a/data/area/misthalin/edgeville/edgeville.npcs.toml b/data/area/misthalin/edgeville/edgeville.npcs.toml index a0b94ef5ba..a21903b1fb 100644 --- a/data/area/misthalin/edgeville/edgeville.npcs.toml +++ b/data/area/misthalin/edgeville/edgeville.npcs.toml @@ -151,8 +151,15 @@ examine = "A person sitting an exam." [cockroach_drone] id = 7158 +hitpoints = 110 +att = 3 +str = 3 +def = 3 categories = ["cockroaches"] examine = "A household pest." +combat_def = "cockroach_drone" +respawn_delay = 60 +drop_table = "cockroach_drone" [oracle] id = 746 diff --git a/data/area/misthalin/edgeville/edgeville.teles.toml b/data/area/misthalin/edgeville/edgeville.teles.toml index c824505f27..74256b1b70 100644 --- a/data/area/misthalin/edgeville/edgeville.teles.toml +++ b/data/area/misthalin/edgeville/edgeville.teles.toml @@ -130,7 +130,7 @@ tile = { x = 3046, y = 3483 } delta = { level = 1 } # 12342 edgeville -[29592] +[stronghold_of_player_safety_stairs_down] option = "Climb-down" tile = { x = 3084, y = 3452 } to = { x = 3086, y = 4247 } @@ -140,16 +140,6 @@ option = "Pull" tile = { x = 3090, y = 3474 } to = { x = 3154, y = 3924 } -[29728] -option = "Enter" -tile = { x = 3076, y = 3463 } -to = { x = 3157, y = 4279, level = 3 } - -[29603] -option = "Use" -tile = { x = 3075, y = 3456 } -to = { x = 3082, y = 4229 } - [trapdoor_80_opened] option = "Climb-down" tile = { x = 3097, y = 3468 } diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.anims.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.anims.toml new file mode 100644 index 0000000000..201d5d5e8e --- /dev/null +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.anims.toml @@ -0,0 +1,31 @@ +[cockroach_drone_attack] +id = 8785 + +[cockroach_soldier_attack] +id = 8786 + +[cockroach_worker_attack] +id = 8787 + +[cockroach_drone_death] +id = 8788 + +[cockroach_soldier_death] +id = 8789 + +[cockroach_worker_death] +id = 8790 + +[cokroach_drone_defend] +id = 8791 + +[cockroach_soldier_defend] +id = 8792 + +[cockroach_worker_defend] +id = 8793 + +[cockroach_soldier_ranged] +id = 8799 + + diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.combat.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.combat.toml new file mode 100644 index 0000000000..3d8927a3f1 --- /dev/null +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.combat.toml @@ -0,0 +1,49 @@ +[cockroach_drone] +attack_speed = 4 +defend_anim = "cokroach_drone_defend" +defend_sound = "cockroach_drone_defend" +death_anim = "cockroach_drone_death" +death_sound = "cockroach_drone_death" + +[cockroach_drone.attack] +anim = "cockroach_drone_attack" +range = 1 +target_hit = { offense = "melee", max = 20 } +target_sound = "cockroach_drone_attack" + +[cockroach_worker] +defend_anim = "cockroach_worker_defend" +defend_sound = "cockroach_worker_defend" +death_anim = "cockroach_worker_death" +death_sound = "cockroach_worker_death" +attack_speed = 4 + +[cockroach_worker.attack] +anim = "cockroach_worker_attack" +range = 1 +target_hit = { offense = "melee", max = 60 } +target_sound = "cockroach_worker_attack" + +[cockroach_soldier] +defend_anim = "cockroach_soldier_defend" +defend_sound = "cockroach_soldier_defend" +death_anim = "cockroach_soldier_death" +death_sound = "cockroach_soldier_death" +attack_speed = 4 + +[cockroach_soldier.melee] +anim = "cockroach_soldier_attack" +range = 2 +target_hit = { offense = "melee", max = 90 } +target_sound = "cockroach_soldier_attack" + + +[cockroach_soldier.ranged] +anim = "cockroach_soldier_ranged" +projectile = "cockroach_soldier_ranged" +range = 8 +projectile_origin_y = 1 +projectile_origin_x = 1 +target_hit = { offense = "range", max = 110 } +condition = "ranged_only" +target_sound = "cockroach_soldier_range" diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.drops.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.drops.toml new file mode 100644 index 0000000000..7308563366 --- /dev/null +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.drops.toml @@ -0,0 +1,72 @@ +[cockroach_drone_drop_table] +type = "all" +drops = [ + { table = "cockroach_drone_secondary" }, +] + +[cockroach_drone_secondary] +roll = 128 +drops = [ + { id = "nothing", chance = 13 }, + { id = "bronze_dagger", chance = 4}, + { id = "bronze_med_helm", chance = 4 }, + { id = "air_rune", min = 1, max = 10, chance = 11 }, + { id = "fire_rune", min = 1, max = 11, chance = 6 }, + { id = "water_rune", min = 1, max = 8, chance = 18 }, + { id = "coins", min = 10, max = 30, chance = 53 }, + { id = "limpwurt_root", chance = 3 }, + { id = "red_spiders_eggs", chance = 2 }, + { id = "coal_noted", amount = 2, chance = 15 }, + { table = "gem_drop_table", chance = 6 }, + { table = "herb_drop_table", chance = 20, members = true } +] + +[cockroach_worker_drop_table] +type = "all" +drops = [ + { table = "cockroach_worker_secondary"}, + { table = "easy_clue_scroll", roll = 128 }, +] + +[cockroach_worker_secondary] +roll = 128 +drops = [ + { id = "mithril_platebody" }, + { id = "mithril_sq_shield", chance = 4 }, + { id = "mithril_ore_noted", amount = 2, chance = 2 }, + { id = "coal_noted", min = 1, max = 2, chance = 10 }, + { id = "coins", min = 30, max = 130, chance = 47 }, + { id = "black_full_helm", chance = 2 }, + { id = "cosmic_rune", min = 1, max = 2, chance = 10 }, + { id = "earth_rune", min = 1, max = 22, chance = 10 }, + { id = "nature_rune", min = 1, max = 20, chance = 10 }, + { id = "chaos_rune", min = 1, max = 18, chance = 10 }, + { id = "battlestaff", members = true }, + { table = "herb_drop_table", chance = 13, members = true }, + { table = "gem_drop_table", chance = 5 }, +] + +[cockroach_soldier_drop_table] +type = "all" +drops = [ + { table = "cockroach_soldier_secondary"}, + { table = "medium_clue_scroll", roll = 128 }, +] + +[cockroach_soldier_secondary] +roll = 128 +drops = [ + { id = "rune_scimitar"}, + { id = "rune_sq_shield"}, + { id = "mithril_med_helm", chance = 4 }, + { id = "death_rune", min = 1, max = 15, chance = 10}, + { id = "law_rune", min = 1, max = 20, chance = 10 }, + { id = "fire_rune", min = 2, max = 59, chance = 10}, + { id = "blood_rune", min = 2, max = 11, chance = 10, members = true }, + { id = "mithril_ore_noted", amount = 3, chance = 10 }, + { id = "adamantite_ore_noted", chance = 4 }, + { id = "coins", min = 100, max = 400, chance = 62}, + { id = "bittercap_mushroom", min = 1, max = 3, chance = 3 }, + { table = "uncommon_seed_drop_table", chance = 8, members = true }, + { table = "gem_drop_table", chance = 7 }, +] \ No newline at end of file diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.gfx.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.gfx.toml new file mode 100644 index 0000000000..f20713d337 --- /dev/null +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.gfx.toml @@ -0,0 +1,7 @@ +[cockroach_soldier_ranged] +id = 1554 +height = 15 +curve = 5 +end_height = 0 +delay = 10 +time_offset = 20 \ No newline at end of file diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.sounds.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.sounds.toml new file mode 100644 index 0000000000..fa07fdce99 --- /dev/null +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.sounds.toml @@ -0,0 +1,29 @@ +[cockroach_worker_death] +id = 4546 + +[cockroach_drone_death] +id = 4547 + +[cockroach_drone_defend] +id = 4548 + +[cockroach_soldier_death] +id = 4549 + +[cockroach_drone_attack] +id = 4550 + +[cockroach_soldier_attack] +id = 4551 + +[cockroach_worker_defend] +id = 4552 + +[cockroach_worker_attack] +id = 4553 + +[cockroach_soldier_defend] +id = 4554 + +[cockroach_soldier_range] +id = 4555 \ No newline at end of file diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.anims.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.anims.toml new file mode 100644 index 0000000000..88d3001be0 --- /dev/null +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.anims.toml @@ -0,0 +1,11 @@ +[pull_ground_lever] +id = 8804 + +[push_ground_lever] +id = 8805 + +[lever_down] +id = 8802 + +[lever_up] +id = 8803 \ No newline at end of file diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.objs.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.objs.toml new file mode 100644 index 0000000000..36e4b54532 --- /dev/null +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.objs.toml @@ -0,0 +1,111 @@ +[player_safety_poster_without_entrance] +id = 29585 +examine = "A pin-up gublinch. Gross!" + +[player_safety_poster] +id = 29586 +examine = "It looks like there's a small hole in the centre of this poster." + +[player_safety_bow_and_arrow] +id = 8773 +examine = "A useful ranging device." + +[player_safety_big_desk] +id = 29588 +examine = "The examiner's desk, covered in past papers." + +[player_safety_coat_of_arms] +id = 29584 +examine = "It says 'Playeri eruditi sunt'" + +[player_safety_shelf] +id = 18156 +examine = "Some shelves." + +[player_safety_desk] +id = 29587 +examine = "A desk for sitting at and writing on." + +[player_safety_satchel] +id = 29583 +examine = "Professor Henry's satchel. There's some sort of cup in here." + +[stronghold_of_player_safety_crevice] +id = 29728 +examine = "It looks like a bit of a squeeze." + +[stronghold_of_player_safety_jail_bed] +id = 29593 +examine = "A dirty bed." + +[stronghold_of_player_safety_jail_bed_2] +id = 29594 +examine = "This tiny rock hammer must have been used to create the chess set here." + +[stronghold_of_player_safety_panning_tray] +id = 17560 +examine = "Fill it with things." + +[stronghold_of_player_safety_broken_plaque] +id = 29608 +examine = "The writing on this plaque is too faded to read." + +[stronghold_of_player_safety_jail_entrance_up] +id = 29602 +examine = "The jail entrance." + +[stronghold_of_player_safety_jail_entrance_down] +id = 29603 +examine = "The jail entrance." + +[stronghold_of_player_safety_bookcase] +id = 29581 +examine = "A good source of books." + +[stronghold_of_player_safety_jail_door] +id = 21001 +examine = "A plaque details this gublinch's crimes." + +[stronghold_of_player_safety_jail_door_2] +id = 21008 +examine = "A plaque details this gublinch's crimes." + +[stronghold_of_player_safety_tunnel] +id = 29623 +examine = "This appears to lead back to the jail cell." + +[stronghold_of_player_safety_slimy_skulls] +id = 29579 +examine = "Skulls covered in bug slime." + +[stronghold_of_player_safety_rocks] +id = 29726 +examine = "Yuck. They are covered in bug slime." + +[stronghold_of_player_safety_rocks_2] +id = 29727 +examine = "Yuck. They are covered in bug slime." + +[stronghold_of_player_safety_rope] +id = 29729 +examine = "I wonder where this leads?" + +[stronghold_of_player_safety_an_old_lever_closed] +id = 29730 +examine = "I wonder what it does." + +[stronghold_of_player_safety_an_old_lever_opened] +id = 29731 +examine = "I wonder what it does." + +[stronghold_of_player_safety_jail_door_locked] +id = 29624 +examine = "It looks pretty dark behind there." + +[stronghold_of_player_safety_treasure_chest_closed] +id = 29577 +examine = "The chest is closed." + +[stronghold_of_player_safety_treasure_chest_opened] +id = 29578 +examine = "The chest is open." \ No newline at end of file diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.teles.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.teles.toml index 4724ce5652..9d5eb27d49 100644 --- a/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.teles.toml +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.teles.toml @@ -4,7 +4,7 @@ option = "Climb-down" tile = { x = 3088, y = 3571 } to = { x = 3089, y = 9971 } -[29589] +[stronghold_of_player_safety_stairs_up] option = "Climb-up" tile = { x = 3086, y = 4244 } to = { x = 3083, y = 3452 } @@ -15,53 +15,62 @@ option = "Pull" tile = { x = 3153, y = 3923 } to = { x = 2562, y = 3311 } -[29729] -option = "Climb" -tile = { x = 3159, y = 4280, level = 3 } -to = { x = 3077, y = 3462 } - -[29660] +[player_safety_stairs_1st_floor_up_north_west] option = "Climb-up" tile = { x = 3147, y = 4249, level = 1 } delta = { x = 3, y = 2, level = 1 } -[29659] +[player_safety_stairs_2nd_floor_down_north_west] option = "Climb-down" tile = { x = 3149, y = 4250, level = 2 } delta = { x = -3, y = -2, level = -1 } -[29656] +[player_safety_stairs_1st_floor_up_south_west] option = "Climb-up" tile = { x = 3147, y = 4246, level = 1 } delta = { x = 3, y = -2, level = 1 } -[29655] +[player_safety_stairs_2nd_floor_down_south_west] option = "Climb-down" tile = { x = 3149, y = 4245, level = 2 } delta = { x = -3, y = 2, level = -1 } -[29664] +[player_safety_stairs_1st_floor_up_south_east] option = "Climb-up" tile = { x = 3157, y = 4246, level = 1 } delta = { x = -3, y = -2, level = 1 } -[29663] +[player_safety_stairs_2nd_floor_down_south_east] option = "Climb-down" tile = { x = 3157, y = 4245, level = 2 } delta = { x = 3, y = 2, level = -1 } -[29668] +[player_safety_stairs_1st_floor_up_north_east] option = "Climb-up" tile = { x = 3157, y = 4249, level = 1 } delta = { x = -3, y = 2, level = 1 } -[29667] +[player_safety_stairs_2nd_floor_down_north_east] option = "Climb-down" tile = { x = 3157, y = 4250, level = 2 } delta = { x = 3, y = -2, level = -1 } -[29672] +[player_safety_stairs_2nd_floor_up_north] option = "Climb-up" tile = { x = 3171, y = 4273, level = 2 } delta = { x = -3, y = -2, level = 1 } +[stronghold_of_player_safety_tunnel] +option = "Use" +tile = { x = 3139, y = 4230, level = 2} +to = { x = 3077, y = 4235 } + +[stronghold_of_player_safety_jail_entrance_up] +option = "Leave" +tile = { x = 3082, y = 4228 } +to = { x = 3074, y = 3456 } + +[stronghold_of_player_safety_jail_door_locked_2] +option = "Open" +tile = { x = 3178, y = 4266 } +to = { x = 3177, y = 4269, level = 2 } \ No newline at end of file diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.varbits.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.varbits.toml new file mode 100644 index 0000000000..f0b5207d24 --- /dev/null +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.varbits.toml @@ -0,0 +1,14 @@ +[stronghold_of_player_safety_chest] +id = 4499 +persist = true +format = "boolean" + +[stronghold_of_player_safety_lever] +id = 4500 +persist = true +format = "boolean" + +[stronghold_of_player_safety_poster] +id = 6278 +persist = true +format = "boolean" \ No newline at end of file diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.vars.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.vars.toml new file mode 100644 index 0000000000..05b984714f --- /dev/null +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.vars.toml @@ -0,0 +1,7 @@ +[safety_rope_climbed] +format = "boolean" +persist = true + +[safety_prison_guard_talked] +format = "boolean" +persist = true \ No newline at end of file diff --git a/data/area/misthalin/lumbridge/lumbridge.combat.toml b/data/area/misthalin/lumbridge/lumbridge.combat.toml index 5a6c60680a..faac3fdf46 100644 --- a/data/area/misthalin/lumbridge/lumbridge.combat.toml +++ b/data/area/misthalin/lumbridge/lumbridge.combat.toml @@ -1,17 +1,27 @@ -[lumbridge_guardsman] -clone = "man" +[lumbridge_guardsman_attackable] attack_speed = 5 defend_anim = "sword_defend" +death_anim = "human_death" -[lumbridge_guardsman.melee] +[lumbridge_guardsman_attackable.melee] range = 1 anim = "sword_slash" target_hit = { offense = "slash", max = 16 } +[lumbridge_guardsman_attackable2] +attack_speed = 5 +defend_anim = "sword_defend" +death_anim = "human_death" + +[lumbridge_guardsman_attackable2.melee] +range = 1 +anim = "sword_lunge" +target_hit = { offense = "slash", max = 16 } + [farmer] -clone = "man" attack_speed = 6 defend_anim = "farmer_defend" +death_anim = "human_death" [farmer.melee] range = 1 diff --git a/data/area/misthalin/lumbridge/lumbridge.npcs.toml b/data/area/misthalin/lumbridge/lumbridge.npcs.toml index 20c73faf6a..4fde4f253d 100644 --- a/data/area/misthalin/lumbridge/lumbridge.npcs.toml +++ b/data/area/misthalin/lumbridge/lumbridge.npcs.toml @@ -312,7 +312,7 @@ id = 12367 hitpoints = 100 att = 4 def = 4 -combat_def = "lumbridge_guardsman" +combat_def = "lumbridge_guardsman_attackable" categories = ["human"] hunt_mode = "aggressive_npcs" respawn_delay = 35 @@ -324,7 +324,7 @@ id = 12368 hitpoints = 100 att = 4 def = 4 -combat_def = "lumbridge_guardsman" +combat_def = "lumbridge_guardsman_attackable2" categories = ["human"] hunt_mode = "aggressive_npcs" respawn_delay = 35 diff --git a/data/area/misthalin/tutorial_island/tutorial_island.teles.toml b/data/area/misthalin/tutorial_island/tutorial_island.teles.toml index 28b02e51aa..a708faf89f 100644 --- a/data/area/misthalin/tutorial_island/tutorial_island.teles.toml +++ b/data/area/misthalin/tutorial_island/tutorial_island.teles.toml @@ -60,10 +60,6 @@ tile = { x = 3082, y = 3124, level = 1 } delta = { level = -1 } # 12436 tutorial_island -[29602] -option = "Leave" -tile = { x = 3082, y = 4228 } -to = { x = 3074, y = 3456 } [3028] option = "Climb-up" diff --git a/data/entity/npc/humanoid/mugger/mugger.combat.toml b/data/entity/npc/humanoid/mugger/mugger.combat.toml index 7117c08696..699f9a2ab3 100644 --- a/data/entity/npc/humanoid/mugger/mugger.combat.toml +++ b/data/entity/npc/humanoid/mugger/mugger.combat.toml @@ -9,4 +9,4 @@ death_sound = "mugger_death" range = 1 anim = "mugger_attack" target_sound = "mugger_attack" -target_hit = { offense = "slash", max = 1 } +target_hit = { offense = "slash", max = 10 } diff --git a/data/entity/obj/door/door.objs.toml b/data/entity/obj/door/door.objs.toml index a25fc049d9..156be10daf 100644 --- a/data/entity/obj/door/door.objs.toml +++ b/data/entity/obj/door/door.objs.toml @@ -2955,10 +2955,10 @@ examine = "A strong metal door." id = 29320 examine = "A strong metal door." -[door_514_opened] +[misthalin_exam_door_opened] id = 29733 -[door_514_closed] +[misthalin_exam_door_closed] id = 29732 examine = "The door is closed." diff --git a/data/entity/obj/stairs_ladders.objs.toml b/data/entity/obj/stairs_ladders.objs.toml index 41efbfc652..b3d9377f68 100644 --- a/data/entity/obj/stairs_ladders.objs.toml +++ b/data/entity/obj/stairs_ladders.objs.toml @@ -172,4 +172,52 @@ examine = "I can climb down this." [lumbridge_church_3rd_floor_ladder_down_west] id = 36991 -examine = "I can climb down this." \ No newline at end of file +examine = "I can climb down this." + +[stronghold_of_player_safety_stairs_up] +id = 29589 +examine = "The guard is watching these stairs." + +[stronghold_of_player_safety_stairs_down] +id = 29592 +examine = "They help one to rise up or down" + +[player_safety_stairs_3rd_floor_down_north] +id = 29671 +examine = "I wonder where they will take me." + +[player_safety_stairs_2nd_floor_up_north] +id = 29672 +examine = "I wonder where they will take me." + +[player_safety_stairs_1st_floor_up_north_west] +id = 29660 +examine = "I wonder where they will take me." + +[player_safety_stairs_2nd_floor_down_south_east] +id = 29663 +examine = "I wonder where they will take me." + +[player_safety_stairs_1st_floor_up_south_east] +id = 29664 +examine = "I wonder where they will take me." + +[player_safety_stairs_2nd_floor_down_north_east] +id = 29667 +examine = "I wonder where they will take me." + +[player_safety_stairs_1st_floor_up_north_east] +id = 29668 +examine = "I wonder where they will take me." + +[player_safety_stairs_2nd_floor_down_south_west] +id = 29655 +examine = "I wonder where they will take me." + +[player_safety_stairs_1st_floor_up_south_west] +id = 29656 +examine = "I wonder where they will take me." + +[player_safety_stairs_2nd_floor_down_north_west] +id = 29659 +examine = "I wonder where they will take me." \ No newline at end of file diff --git a/data/quest/free/swept_away/swept_away.teles.toml b/data/quest/free/swept_away/swept_away.teles.toml index e2bfa58746..0508dcff2c 100644 --- a/data/quest/free/swept_away/swept_away.teles.toml +++ b/data/quest/free/swept_away/swept_away.teles.toml @@ -1,5 +1,5 @@ # 12614 swept_away -[29671] +[player_safety_stairs_3rd_floor_down_north] option = "Climb-down" tile = { x = 3171, y = 4272, level = 3 } to = { x = 3174, y = 4273, level = 2 } diff --git a/data/social/report/report.ifaces.toml b/data/social/report/report.ifaces.toml index 6d43bb5103..9a4eb0b0cc 100644 --- a/data/social/report/report.ifaces.toml +++ b/data/social/report/report.ifaces.toml @@ -1,6 +1,15 @@ -[report_abuse_name] +[report_abuse_player_security] id = 593 -[report_abuse_select] +[.name] +id = 32 + +[.abuse] +id = 97 + +[.ignore] +id = 110 + +[report_abuse] id = 594 diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/queue/ActionPriority.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/queue/ActionPriority.kt index 6ce01041e0..74dd347f4a 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/queue/ActionPriority.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/queue/ActionPriority.kt @@ -19,7 +19,7 @@ enum class ActionPriority( Strong(closeInterfaces = true), /** - * Closes interfaces and can't be paused or canceled by anything other than suspensions + * Closes interfaces and can't be paused or cancelled by anything other than suspensions */ Soft(closeInterfaces = true), } diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/CockroachSoldier.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/CockroachSoldier.kt new file mode 100644 index 0000000000..4081bc2b39 --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/CockroachSoldier.kt @@ -0,0 +1,13 @@ +package content.area.misthalin.edgeville.stronghold_of_player_safety + +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.entity.character.player.Player + +class CockroachSoldier : Script { + + init { + npcCondition("ranged_only") { target -> + target is Player && tile.distanceTo(target.tile) > 2 + } + } +} diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/ProfessorHenry.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/ProfessorHenry.kt new file mode 100644 index 0000000000..8f745635d4 --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/ProfessorHenry.kt @@ -0,0 +1,22 @@ +package content.area.misthalin.edgeville.stronghold_of_player_safety + +import content.entity.player.dialogue.Happy +import content.entity.player.dialogue.Neutral +import content.entity.player.dialogue.type.npc +import content.entity.player.dialogue.type.player +import world.gregs.voidps.engine.Script + +class ProfessorHenry : Script { + init { + npcOperate("Talk-to", "professor_henry") { + player("Hello!") + npc("Good day!") + npc("Did you want to know about the old jail block? We always need adventurers to keep the cockroaches in check.") + player("Do I need to do your exam?") + npc("No, the exam isn't really for adventurers like you. Are you looking for the jail block?") + player("Sure, tell me about the jail.") + npc("In the cells downstairs there's a secret passage into the old prison. I hear that fame and fortune awaits a suitably skilled adventurer.") + player("Thanks, I'll look into that.") + } + } +} diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt new file mode 100644 index 0000000000..283c0e9eb8 --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt @@ -0,0 +1,92 @@ +package content.area.misthalin.edgeville.stronghold_of_player_safety + +import content.entity.obj.door.enterDoor +import content.entity.player.dialogue.type.statement +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.entity.character.areaSound +import world.gregs.voidps.engine.entity.character.move.tele +import world.gregs.voidps.type.Tile + +class StrongholdOfPlayerSafety : Script { + + init { + playerSpawn { + sendVariable("stronghold_of_player_safety_poster") + sendVariable("stronghold_of_player_safety_lever") + } + + objectOperate("Open", "misthalin_exam_door_closed") { (target) -> + // From wiki: The main door into the Training Centre, which is locked, preventing players from opening it from the outside, until they talk to the Guard in the jail and go through the entire conversation about reporting rule-breakers + if (get("safety_prison_guard_talked", false)) { + enterDoor(target) + } else { + message("The door appears to be locked. You'll have to find another way in.") + return@objectOperate + } + } + + objectOperate("Use", "stronghold_of_player_safety_jail_entrance_down") { + arriveDelay() + tele(3082, 4229, 0) + set("stronghold_of_player_safety_poster", true) + } + + objectOperate("Pull-back", "player_safety_poster") { (target) -> + walkToDelay(target.tile) + statement("There appears to be a tunnel behind the poster.") + tele(3140, 4230, 2) + } + + objectOperate("Climb", "stronghold_of_player_safety_rope") { (target) -> + walkToDelay(target.tile) + set("safety_rope_climbed", true) + tele(3077, 3462, 0) + } + + objectOperate("Pull", "stronghold_of_player_safety_an_old_lever_closed") { (target) -> + arriveDelay() + animDelay("pull_ground_lever") + areaSound("lever", target.tile) + delay(2) + areaSound("unlock", target.tile) + delay(1) + message("You hear cogs and gears moving and a distant unlocking sound.") + set("stronghold_of_player_safety_lever", true) + } + + objectOperate("Pull", "stronghold_of_player_safety_an_old_lever_opened") { (target) -> + arriveDelay() + animDelay("push_ground_lever") + areaSound("lever", target.tile) + delay(1) + areaSound("unlock", target.tile) + delay(1) + message("You hear cogs and gears moving and the sound of heavy locks falling into place.") + set("stronghold_of_player_safety_lever", false) + } + + objectOperate("Enter", "stronghold_of_player_safety_crevice") { + arriveDelay() + if (get("safety_rope_climbed", false)) { + tele(3157, 4279, 3) + } else { + message("You're not sure if you should go in there; perhaps you should find another way in.") + } + } + + objectOperate("Open", "stronghold_of_player_safety_jail_door_locked") { (target) -> + arriveDelay() + if (get("stronghold_of_player_safety_lever", false)) { + when (target.tile) { + Tile(3178, 4266, 0) -> tele(3177, 4269, 2) + Tile(3178, 4269, 2) -> tele(3177, 4266, 0) + Tile(3142, 4270, 0) -> tele(3142, 4272, 1) + Tile(3141, 4272, 1) -> tele(3143, 4270, 0) + } + } else { + message("The door seems to be locked by some kind of mechanism.") + } + } + } +} diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyGuard.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyGuard.kt new file mode 100644 index 0000000000..6fdf76aef6 --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyGuard.kt @@ -0,0 +1,57 @@ +package content.area.misthalin.edgeville.stronghold_of_player_safety + +import content.entity.player.dialogue.Happy +import content.entity.player.dialogue.Neutral +import content.entity.player.dialogue.Quiz +import content.entity.player.dialogue.Shifty +import content.entity.player.dialogue.type.choice +import content.entity.player.dialogue.type.npc +import content.entity.player.dialogue.type.player +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.client.ui.closeMenu +import world.gregs.voidps.engine.client.ui.open +import world.gregs.voidps.engine.entity.character.player.Player + +class StrongholdOfPlayerSafetyGuard : Script { + init { + npcOperate("Talk-to", "guard_stronghold_of_player_safety") { + if (get("safety_prison_guard_talked", false)) { + npc("Hello again. Did you want me to tell you about the Report Abuse button?") + choice { + option("Yes, please.") { + reportAbuse() + } + option("No thanks.") + } + } else { + npc("Can I help you?") + player("I hope so. What is this place?") + npc("Above us is the Misthalin Training Centre of Excellence, where young adventurers are taught things that will help keep themselves safe.") + npc("They say that hidden away somewhere here is the entrance to the old jail, which no doubt has fabulous treasures for those willing to search for them.") + npc("Together they're called the Stronghold of Player Safety, for historical reasons.") + player("So what do you do?") + npc("I guard this stairway to make sure that prospective students are ready, and to explain the Report Abusive function.") + set("safety_prison_guard_talked", true) + choice { + option("What is this Report Abuse thing?") { + reportAbuse() + } + option("That's interesting. Goodbye.") + } + } + } + } + + suspend fun Player.reportAbuse() { + npc("Should you find a player who acts in a way that breaks one of our rules, you should report them.") + npc("Reporting is very simple and easy to do. Simply click the Report Abuse button at the bottom of the screen and you will be shown the following screens:") + open("report_abuse_player_security") + npc("On the first page, simply enter the player's name in the box and then click 'Next'") + interfaces.sendVisibility("report_abuse_player_security", "name", false) + interfaces.sendVisibility("report_abuse_player_security", "abuse", true) + npc("On the following page, click on the offence that the player has commited.") + closeMenu() + npc("Finally, you'll be given the option to temporarily ignore the player you've reported. That will last until you next log out.") + player("Thank you. I'll bear that in mind.") + } +} diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyRewards.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyRewards.kt new file mode 100644 index 0000000000..f79a45f02d --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyRewards.kt @@ -0,0 +1,60 @@ +package content.area.misthalin.edgeville.stronghold_of_player_safety + +import content.entity.player.bank.ownsItem +import content.entity.player.dialogue.type.item +import content.entity.player.dialogue.type.skillLamp +import content.entity.player.dialogue.type.statement +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.entity.character.player.skill.exp.exp +import world.gregs.voidps.engine.inv.add +import world.gregs.voidps.engine.inv.inventory +import world.gregs.voidps.engine.inv.remove + +class StrongholdOfPlayerSafetyRewards : Script { + + init { + playerSpawn { + sendVariable("stronghold_of_player_safety_chest") + } + + objectOperate("Open", "stronghold_of_player_safety_treasure_chest_closed") { (target) -> + if (inventory.isFull()) { + // https://youtu.be/eSZY9zdBAwg?si=UlMwKzgDA51IZ7TF&t=203 + statement("You don't have any room in your inventory for the treasure.") + message("You don't have any room in your inventory for the treasure.") + return@objectOperate + } + set("stronghold_of_player_safety_chest", true) + inventory.add("coins", 10000) + inventory.add("safety_gloves") + inventory.add("antique_lamp_misthalin_training_centre_of_excellence") + inventory.add("antique_lamp_misthalin_training_centre_of_excellence_2") + set("unlocked_emote_safety_first", true) + item("safety_gloves", 400, "You open the chest to find a large pile of gold, along with a pair of safety gloves and two antique lamps. Also in the chest is the secret of the 'Safety First' emote.") + } + + itemOption("Rub", "antique_lamp_misthalin_training_centre_of_excellence*") { (item, slot) -> + val skill = skillLamp() + if (inventory.remove(slot, item.id)) { + exp(skill, 500.0) + statement("Your wish has been granted!
You have been awarded 500 ${skill.name} experience!") + } + } + objectOperate("Search", "stronghold_of_player_safety_treasure_chest_opened") { + if (get("unlocked_emote_safety_first", false)) { + if (ownsItem("safety_gloves")) { + statement("The chest appears to be empty.") + message("The chest is already open and empty.") + } else { + if (inventory.isFull()) { + message("There are some gloves in the chest, but you have no space for them in your inventory.") + return@objectOperate + } + inventory.add("safety_gloves") + message("You find another pair of gloves in the chest.") + } + } + } + } +} diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyShelf.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyShelf.kt new file mode 100644 index 0000000000..f4c104341a --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyShelf.kt @@ -0,0 +1,19 @@ +package content.area.misthalin.edgeville.stronghold_of_player_safety + +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.client.message +import world.gregs.voidps.type.random + +class StrongholdOfPlayerSafetyShelf : Script { + init { + objectOperate("Search", "player_safety_shelf") { + message("You search the books...") + delay(2) + when (random.nextInt(0, 3)) { + 0 -> message("None of them look very interesting.") + 1 -> message("You find nothing to interest you.") + 2 -> message("You don't find anything that you'd ever want to read.") + } + } + } +} diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyStudents.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyStudents.kt new file mode 100644 index 0000000000..a15049cb63 --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyStudents.kt @@ -0,0 +1,65 @@ +package content.area.misthalin.edgeville.stronghold_of_player_safety + +import content.entity.player.dialogue.Angry +import content.entity.player.dialogue.Blink +import content.entity.player.dialogue.Confused +import content.entity.player.dialogue.Happy +import content.entity.player.dialogue.Quiz +import content.entity.player.dialogue.Sad +import content.entity.player.dialogue.Shock +import content.entity.player.dialogue.type.npc +import content.entity.player.dialogue.type.player +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.entity.character.player.Player + +class StrongholdOfPlayerSafetyStudents : Script { + init { + npcOperate("Talk-to", "student_barbarian_village") { + player("How are you doing with the exam?") + npc("...") + player("That good, huh?") + noTalking() + } + npcOperate("Talk-to", "student_barbarian_village_2") { + player("How's the exam going at the moment?") + npc("What exam?") + player("Uh...the exam you're taking?") + npc("I'm not taking an exam. I'm drawing pictures.") + player("Oh.I...er...see.") + cheatingExam() + } + npcOperate("Talk-to", "student_barbarian_village_3") { + npc("What's 769 x 426?") + player("What? Er...I don't know.") + npc("Me neither.") + noTalking() + } + npcOperate("Talk-to", "student_barbarian_village_4") { + npc("I broke my pencil. Do you have a spare one?") + player("No, I don't.") + cheatingExam() + } + npcOperate("Talk-to", "student_edgeville") { + npc("Bah! I hate maths.") + player("I thought this was a Player Safety exam?") + npc("Yes, it is - but i just hate maths.") + player("Ah, okay.") + cheatingExam() + } + npcOperate("Talk-to", "student_edgeville_2") { + npc("*Sob!* I'm going to fail! I hate exams.") + player("Cheer up! I'm sure you'll do fine. Try to concentrate.") + noTalking() + } + } + + suspend fun Player.noTalking() { + npc("professor_henry", "No talking in the exam, please.") + player("Sorry!") + } + + suspend fun Player.cheatingExam() { + npc("professor_henry", "Please leave the students alone while they take their exams. We don't want any cheating in here.") + player("Oh! Sorry about that.") + } +} diff --git a/game/src/main/kotlin/content/social/report/ReportAbuse.kt b/game/src/main/kotlin/content/social/report/ReportAbuse.kt index fbba2cc8c8..26650def55 100644 --- a/game/src/main/kotlin/content/social/report/ReportAbuse.kt +++ b/game/src/main/kotlin/content/social/report/ReportAbuse.kt @@ -13,7 +13,7 @@ class ReportAbuse : Script { message("Please finish what you're doing first.") return@interfaceOption } - open("report_abuse_select") + open("report_abuse_player_security") } } } diff --git a/game/src/test/kotlin/content/entity/obj/ObjectTest.kt b/game/src/test/kotlin/content/entity/obj/ObjectTest.kt index d742b8be74..47f30015fa 100644 --- a/game/src/test/kotlin/content/entity/obj/ObjectTest.kt +++ b/game/src/test/kotlin/content/entity/obj/ObjectTest.kt @@ -41,7 +41,7 @@ internal class ObjectTest : WorldTest() { val door = GameObjects.getLayer(Tile(3226, 3214), ObjectLayer.WALL)!! player.objectOption(door, "Open") - tick() + tick(2) handler.walk(Walk(3226, 3214), player) tick(2)