diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm index c7b055879f1..969a95bf120 100644 --- a/code/__DEFINES/genetics.dm +++ b/code/__DEFINES/genetics.dm @@ -117,6 +117,17 @@ #define BLOOD_VOLUME_BAD 224 #define BLOOD_VOLUME_SURVIVE 122 +//Sizes of mobs, used by mob/living/var/mob_size +#define MOB_SIZE_TINY 0 +#define MOB_SIZE_SMALL 1 +#define MOB_SIZE_HUMAN 2 +#define MOB_SIZE_LARGE 3 + +//Ventcrawling defines +#define VENTCRAWLER_NONE 0 +#define VENTCRAWLER_NUDE 1 +#define VENTCRAWLER_ALWAYS 2 + //Used for calculations for negative effects of having genetics powers #define DEFAULT_GENE_STABILITY 100 #define GENE_INSTABILITY_MINOR 5 diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 4eb11963eff..6e961d8482d 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -30,11 +30,6 @@ #define CLICK_CD_CLICK_ABILITY 6 #define CLICK_CD_RAPID 2 -//Sizes of mobs, used by mob/living/var/mob_size -#define MOB_SIZE_TINY 0 -#define MOB_SIZE_SMALL 1 -#define MOB_SIZE_HUMAN 2 -#define MOB_SIZE_LARGE 3 /// #define ROUNDSTART_LOGOUT_REPORT_TIME 6000 //Amount of time (in deciseconds) after the rounds starts, that the player disconnect report is issued. diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 7a66c250e94..8ddf93302d5 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -733,6 +733,7 @@ item_state = "explorer1" storage_slots = 6 max_w_class = WEIGHT_CLASS_BULKY + max_combined_w_class = 20 use_item_overlays = 0 can_hold = list( /obj/item/crowbar, @@ -750,6 +751,7 @@ /obj/item/resonator, /obj/item/mining_scanner, /obj/item/pickaxe, + /obj/item/shovel, /obj/item/stack/sheet/animalhide, /obj/item/stack/sheet/sinew, /obj/item/stack/sheet/bone, @@ -764,13 +766,25 @@ /obj/item/survivalcapsule, /obj/item/t_scanner/adv_mining_scanner, /obj/item/reagent_containers/food/pill, + /obj/item/storage/pill_bottle, /obj/item/stack/ore, /obj/item/reagent_containers/food/drinks, - /obj/item/organ/internal/hivelord_core, + /obj/item/organ/internal/regenerative_core, /obj/item/wormhole_jaunter, /obj/item/storage/bag/plants, /obj/item/stack/marker_beacon) -/obj/item/storage/belt/mining/New() - ..() - new /obj/item/survivalcapsule(src) \ No newline at end of file +/obj/item/storage/belt/mining/vendor/Initialize(mapload) + . = ..() + new /obj/item/survivalcapsule(src) + +/obj/item/storage/belt/mining/alt + icon_state = "explorer2" + item_state = "explorer2" + +/obj/item/storage/belt/mining/primitive + name = "hunter's belt" + desc = "A versatile belt, woven from sinew." + icon_state = "ebelt" + item_state = "ebelt" + storage_slots = 5 \ No newline at end of file diff --git a/code/game/turfs/simulated/floor/asteroid.dm b/code/game/turfs/simulated/floor/asteroid.dm index 275b3a49502..7c7e986f57c 100644 --- a/code/game/turfs/simulated/floor/asteroid.dm +++ b/code/game/turfs/simulated/floor/asteroid.dm @@ -160,8 +160,8 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me /turf/simulated/floor/plating/asteroid/airless/cave/volcanic mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/random = 50, /mob/living/simple_animal/hostile/spawner/lavaland/goliath = 3, \ - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher = 40, /mob/living/simple_animal/hostile/spawner/lavaland = 2, \ - /mob/living/simple_animal/hostile/asteroid/hivelord/legion = 30, /mob/living/simple_animal/hostile/spawner/lavaland/legion = 3, \ + /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random = 40, /mob/living/simple_animal/hostile/spawner/lavaland = 2, \ + /mob/living/simple_animal/hostile/asteroid/hivelord/legion/random = 30, /mob/living/simple_animal/hostile/spawner/lavaland/legion = 3, \ SPAWN_MEGAFAUNA = 6, /mob/living/simple_animal/hostile/asteroid/goldgrub = 10) data_having_type = /turf/simulated/floor/plating/asteroid/airless/cave/volcanic/has_data diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 0d7267d9a92..8e7eb674946 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -520,8 +520,8 @@ icon_state = "goliath_cloak" item_state = "goliath_cloak" desc = "A staunch, practical cape made out of numerous monster materials, it is coveted amongst exiles & hermits." - allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe, /obj/item/twohanded/spear) - armor = list("melee" = 35, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot + allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/pickaxe, /obj/item/twohanded/spear, /obj/item/organ/internal/regenerative_core/legion, /obj/item/kitchen/knife/combat/survival) + armor = list(melee = 35, bullet = 10, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot hoodtype = /obj/item/clothing/head/hooded/goliath body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS @@ -530,7 +530,7 @@ icon_state = "golhood" item_state = "golhood" desc = "A protective & concealing hood." - armor = list("melee" = 35, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) + armor = list(melee = 35, bullet = 10, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0) flags = BLOCKHAIR flags_cover = HEADCOVERSEYES diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm index 2d96c46d161..9d56d8ccd6e 100644 --- a/code/modules/mining/equipment/regenerative_core.dm +++ b/code/modules/mining/equipment/regenerative_core.dm @@ -9,8 +9,8 @@ /obj/item/hivelordstabilizer/afterattack(obj/item/organ/internal/M, mob/user) . = ..() - var/obj/item/organ/internal/hivelord_core/C = M - if(!istype(C, /obj/item/organ/internal/hivelord_core)) + var/obj/item/organ/internal/regenerative_core/C = M + if(!istype(C, /obj/item/organ/internal/regenerative_core)) to_chat(user, "The stabilizer only works on certain types of monster organs, generally regenerative in nature.") return ..() @@ -19,8 +19,8 @@ qdel(src) /************************Hivelord core*******************/ -/obj/item/organ/internal/hivelord_core - name = "hivelord remains" +/obj/item/organ/internal/regenerative_core + name = "regenerative core" desc = "All that remains of a hivelord. It can be used to help keep your body going, but it will rapidly decay into uselessness." icon_state = "roro core 2" flags = NOBLUDGEON @@ -30,15 +30,15 @@ var/inert = 0 var/preserved = 0 -/obj/item/organ/internal/hivelord_core/New() - ..() +/obj/item/organ/internal/regenerative_core/Initialize(mapload) + . = ..() addtimer(CALLBACK(src, .proc/inert_check), 2400) -/obj/item/organ/internal/hivelord_core/proc/inert_check() +/obj/item/organ/internal/regenerative_core/proc/inert_check() if(!preserved) go_inert() -/obj/item/organ/internal/hivelord_core/proc/preserved(implanted = 0) +/obj/item/organ/internal/regenerative_core/proc/preserved(implanted = 0) inert = FALSE preserved = TRUE update_icon() @@ -48,27 +48,27 @@ else feedback_add_details("hivelord_core", "[type]|stabilizer") -/obj/item/organ/internal/hivelord_core/proc/go_inert() +/obj/item/organ/internal/regenerative_core/proc/go_inert() inert = TRUE name = "decayed regenerative core" desc = "All that remains of a hivelord. It has decayed, and is completely useless." feedback_add_details("hivelord_core", "[src.type]|inert") update_icon() -/obj/item/organ/internal/hivelord_core/ui_action_click() +/obj/item/organ/internal/regenerative_core/ui_action_click() if(inert) to_chat(owner, "[src] breaks down as it tries to activate.") else owner.revive() qdel(src) -/obj/item/organ/internal/hivelord_core/on_life() +/obj/item/organ/internal/regenerative_core/on_life() ..() if(owner.health < HEALTH_THRESHOLD_CRIT) ui_action_click() ///Handles applying the core, logging and status/mood events. -/obj/item/organ/internal/hivelord_core/proc/applyto(atom/target, mob/user) +/obj/item/organ/internal/regenerative_core/proc/applyto(atom/target, mob/user) if(ishuman(target)) var/mob/living/carbon/human/H = target if(inert) @@ -88,40 +88,39 @@ user.drop_item() qdel(src) -/obj/item/organ/internal/hivelord_core/afterattack(atom/target, mob/user, proximity_flag) +/obj/item/organ/internal/regenerative_core/afterattack(atom/target, mob/user, proximity_flag) . = ..() if(proximity_flag) applyto(target, user) -/obj/item/organ/internal/hivelord_core/attack_self(mob/user) +/obj/item/organ/internal/regenerative_core/attack_self(mob/user) applyto(user, user) -/obj/item/organ/internal/hivelord_core/insert(mob/living/carbon/M, special = 0) +/obj/item/organ/internal/regenerative_core/insert(mob/living/carbon/M, special = 0) ..() if(!preserved && !inert) preserved(TRUE) owner.visible_message("[src] stabilizes as it's inserted.") -/obj/item/organ/internal/hivelord_core/remove(mob/living/carbon/M, special = 0) +/obj/item/organ/internal/regenerative_core/remove(mob/living/carbon/M, special = 0) if(!inert && !special) owner.visible_message("[src] rapidly decays as it's removed.") go_inert() return ..() -/obj/item/organ/internal/hivelord_core/prepare_eat() +/obj/item/organ/internal/regenerative_core/prepare_eat() return null /*************************Legion core********************/ -/obj/item/organ/internal/hivelord_core/legion - name = "legion's soul" +/obj/item/organ/internal/regenerative_core/legion desc = "A strange rock that crackles with power. It can be used to heal completely, but it will rapidly decay into uselessness." icon_state = "legion_soul" -/obj/item/organ/internal/hivelord_core/legion/New() - ..() +/obj/item/organ/internal/regenerative_core/legion/Initialize(mapload) + . = ..() update_icon() -/obj/item/organ/internal/hivelord_core/legion/update_icon() +/obj/item/organ/internal/regenerative_core/legion/update_icon() icon_state = inert ? "legion_soul_inert" : "legion_soul" cut_overlays() if(!inert && !preserved) @@ -130,10 +129,10 @@ var/datum/action/A = X A.UpdateButtonIcon() -/obj/item/organ/internal/hivelord_core/legion/go_inert() +/obj/item/organ/internal/regenerative_core/legion/go_inert() ..() desc = "[src] has become inert. It has decayed, and is completely useless." -/obj/item/organ/internal/hivelord_core/legion/preserved(implanted = 0) +/obj/item/organ/internal/regenerative_core/legion/preserved(implanted = 0) ..() desc = "[src] has been stabilized. It is preserved, allowing you to use it to heal completely without danger of decay." \ No newline at end of file diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index 4de84bb70c4..8f85908a995 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -219,7 +219,7 @@ var/drop_location = drop_location() switch(selection) if("Survival Capsule and Explorer's Webbing") - new /obj/item/storage/belt/mining(drop_location) + new /obj/item/storage/belt/mining/vendor(drop_location) if("Resonator Kit") new /obj/item/extinguisher/mini(drop_location) new /obj/item/resonator(drop_location) diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index 1d37f04312d..0429a53ad11 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -18,7 +18,7 @@ attack_sound = 'sound/creatures/headcrab_attack.ogg' speak_emote = list("hisses") var/is_zombie = 0 - stat_attack = 1 //so they continue to attack when they are on the ground. + stat_attack = UNCONSCIOUS //so they continue to attack when they are on the ground. var/host_species = "" var/list/human_overlays = list() diff --git a/code/modules/mob/living/simple_animal/hostile/headslug.dm b/code/modules/mob/living/simple_animal/hostile/headslug.dm index a14ed91aa8f..99c11431695 100644 --- a/code/modules/mob/living/simple_animal/hostile/headslug.dm +++ b/code/modules/mob/living/simple_animal/hostile/headslug.dm @@ -15,7 +15,7 @@ attack_sound = 'sound/weapons/bite.ogg' faction = list("creature") robust_searching = 1 - stat_attack = 2 + stat_attack = DEAD obj_damage = 0 environment_smash = 0 speak_emote = list("squeaks") diff --git a/code/modules/mob/living/simple_animal/hostile/hellhound.dm b/code/modules/mob/living/simple_animal/hostile/hellhound.dm index 40318b914bc..3953ce01a8b 100644 --- a/code/modules/mob/living/simple_animal/hostile/hellhound.dm +++ b/code/modules/mob/living/simple_animal/hostile/hellhound.dm @@ -22,7 +22,7 @@ health = 250 obj_damage = 50 robust_searching = 1 - stat_attack = 1 + stat_attack = UNCONSCIOUS attacktext = "savages" attack_sound = 'sound/effects/bite.ogg' speak_emote = list("growls") diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm index 05bdf9c76a6..e7ad2c5fab6 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm @@ -42,6 +42,8 @@ Difficulty: Medium wander = FALSE del_on_death = TRUE blood_volume = BLOOD_VOLUME_NORMAL + internal_type = /obj/item/gps/internal/miner + medal_type = BOSS_MEDAL_MINER var/obj/item/melee/energy/cleaving_saw/miner/miner_saw var/time_until_next_transform = 0 var/dashing = FALSE @@ -63,7 +65,6 @@ Difficulty: Medium /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Initialize(mapload) . = ..() miner_saw = new(src) - internal_gps = new/obj/item/gps/internal/miner(src) // Add a zone selection UI; otherwise the mob can't melee attack properly. zone_sel = new /obj/screen/zone_sel() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 5b605551a22..43274952362 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -45,6 +45,7 @@ Difficulty: Hard crusher_loot = list(/obj/structure/closet/crate/necropolis/bubblegum/crusher) loot = list(/obj/structure/closet/crate/necropolis/bubblegum) var/charging = 0 + internal_type = /obj/item/gps/internal/bubblegum medal_type = BOSS_MEDAL_BUBBLEGUM score_type = BUBBLEGUM_SCORE deathmessage = "sinks into a pool of blood, fleeing the battle. You've won, for now... " @@ -104,17 +105,17 @@ Difficulty: Hard spawn(0) warp_charge() -/mob/living/simple_animal/hostile/megafauna/bubblegum/New() - ..() - for(var/mob/living/simple_animal/hostile/megafauna/bubblegum/B in GLOB.mob_list) - if(B != src) - qdel(src) //There can be only one - break +/mob/living/simple_animal/hostile/megafauna/bubblegum/Initialize(mapload) + . = ..() + if(true_spawn) + for(var/mob/living/simple_animal/hostile/megafauna/bubblegum/B in GLOB.living_mob_list) + if(B != src) + qdel(src) //There can be only one + return var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new AddSpell(bloodspell) if(istype(loc, /obj/effect/dummy/slaughter)) bloodspell.phased = 1 - internal_gps = new/obj/item/gps/internal/bubblegum(src) /mob/living/simple_animal/hostile/megafauna/bubblegum/do_attack_animation(atom/A, visual_effect_icon, used_item, no_effect, end_pixel_y) if(!charging) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 3ebea47e353..f275f7ce7d0 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -43,6 +43,7 @@ Difficulty: Very Hard ranged = 1 pixel_x = -32 del_on_death = 1 + internal_type = /obj/item/gps/internal/colossus medal_type = BOSS_MEDAL_COLOSSUS score_type = COLOSSUS_SCORE crusher_loot = list(/obj/structure/closet/crate/necropolis/colossus/crusher) @@ -92,11 +93,6 @@ Difficulty: Very Hard spawn(0) alternating_dir_shots() - -/mob/living/simple_animal/hostile/megafauna/colossus/New() - ..() - internal_gps = new/obj/item/gps/internal/colossus(src) - /obj/effect/temp_visual/at_shield name = "anti-toolbox field" desc = "A shimmering forcefield protecting the colossus." diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 00f67674546..390765583f4 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -48,15 +48,12 @@ Difficulty: Medium butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30) var/swooping = 0 var/swoop_cooldown = 0 + internal_type = /obj/item/gps/internal/dragon medal_type = BOSS_MEDAL_DRAKE score_type = DRAKE_SCORE deathmessage = "collapses into a pile of bones, its flesh sloughing away." death_sound = 'sound/misc/demon_dies.ogg' -/mob/living/simple_animal/hostile/megafauna/dragon/New() - ..() - internal_gps = new/obj/item/gps/internal/dragon(src) - /mob/living/simple_animal/hostile/megafauna/dragon/ex_act(severity, target) if(severity == 3) return diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 4ed44c616c8..70c713b37eb 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -66,14 +66,14 @@ Difficulty: Hard var/did_reset = TRUE //if we timed out, returned to our rune, and healed some //var/list/kill_phrases = list("Wsyvgi sj irivkc xettih. Vitemvmrk...", "Irivkc wsyvgi jsyrh. Vitemvmrk...", "Jyip jsyrh. Egxmzexmrk vitemv gcgpiw...") //var/list/target_phrases = list("Xevkix psgexih.", "Iriqc jsyrh.", "Eguymvih xevkix.") + internal_type = /obj/item/gps/internal/hierophant medal_type = BOSS_MEDAL_HIEROPHANT score_type = HIEROPHANT_SCORE del_on_death = TRUE death_sound = 'sound/magic/repulse.ogg' -/mob/living/simple_animal/hostile/megafauna/hierophant/New() - ..() - internal_gps = new/obj/item/gps/internal/hierophant(src) +/mob/living/simple_animal/hostile/megafauna/hierophant/Initialize(mapload) + . = ..() spawned_rune = new(loc) /mob/living/simple_animal/hostile/megafauna/hierophant/Life(seconds, times_fired) @@ -108,7 +108,7 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/hierophant/Destroy() QDEL_NULL(spawned_rune) - . = ..() + return ..() /mob/living/simple_animal/hostile/megafauna/hierophant/devour(mob/living/L) for(var/obj/item/W in L) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index d26400bceca..5be97564787 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -39,6 +39,7 @@ Difficulty: Medium ranged_cooldown_time = 20 var/size = 5 var/charging = 0 + internal_type = /obj/item/gps/internal/legion medal_type = BOSS_MEDAL_LEGION score_type = LEGION_SCORE pixel_y = -90 @@ -48,11 +49,7 @@ Difficulty: Medium elimination = 1 appearance_flags = 0 mouse_opacity = MOUSE_OPACITY_ICON - stat_attack = 1 // Overriden from /tg/ - otherwise Legion starts chasing its minions - -/mob/living/simple_animal/hostile/megafauna/legion/New() - ..() - internal_gps = new/obj/item/gps/internal/legion(src) + stat_attack = UNCONSCIOUS // Overriden from /tg/ - otherwise Legion starts chasing its minions /mob/living/simple_animal/hostile/megafauna/legion/AttackingTarget() . = ..() @@ -132,6 +129,8 @@ Difficulty: Medium elimination = 0 else if(prob(5)) loot = list(/obj/structure/closet/crate/necropolis/tendril) + if(!true_spawn) + loot = null return ..() /mob/living/simple_animal/hostile/megafauna/legion/Process_Spacemove(movement_dir = 0) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index 20df360a51a..130cfb3f847 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -13,7 +13,7 @@ flying = 1 robust_searching = 1 ranged_ignores_vision = TRUE - stat_attack = 2 + stat_attack = DEAD atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) damage_coeff = list(BRUTE = 1, BURN = 0.5, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) minbodytemp = 0 @@ -26,17 +26,21 @@ var/elimination = 0 var/anger_modifier = 0 var/obj/item/gps/internal_gps + var/internal_type move_force = MOVE_FORCE_OVERPOWERING move_resist = MOVE_FORCE_OVERPOWERING pull_force = MOVE_FORCE_OVERPOWERING mob_size = MOB_SIZE_LARGE layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise mouse_opacity = MOUSE_OPACITY_OPAQUE // Easier to click on in melee, they're giant targets anyway + var/true_spawn = TRUE // if this is a megafauna that should grant achievements, or have a gps signal var/chosen_attack = 1 // chosen attack num var/list/attack_action_types = list() -/mob/living/simple_animal/hostile/megafauna/New() - ..() +/mob/living/simple_animal/hostile/megafauna/Initialize(mapload) + . = ..() + if(internal_type && true_spawn) + internal = new internal_type(src) apply_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING) for(var/action_type in attack_action_types) var/datum/action/innate/megafauna_attack/attack_action = new action_type() @@ -44,7 +48,7 @@ /mob/living/simple_animal/hostile/megafauna/Destroy() QDEL_NULL(internal_gps) - . = ..() + return ..() /mob/living/simple_animal/hostile/megafauna/can_die() return ..() && health <= 0 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm index 5a1d10edfb2..f31b6a8619b 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm @@ -47,7 +47,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa icon_state = "swarmer_console" health = 750 maxHealth = 750 //""""low-ish"""" HP because it's a passive boss, and the swarm itself is the real foe - internal_gps = /obj/item/gps/internal/swarmer_beacon + internal_type = /obj/item/gps/internal/swarmer_beacon medal_type = BOSS_MEDAL_SWARMERS score_type = SWARMER_BEACON_SCORE faction = list("mining", "boss", "swarmer") diff --git a/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm index f960471d510..4d5009109f3 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm @@ -1,7 +1,8 @@ +//A beast that fire freezing blasts. /mob/living/simple_animal/hostile/asteroid/basilisk name = "basilisk" desc = "A territorial beast, covered in a thick shell that absorbs energy. Its stare causes victims to freeze from the inside." - icon = 'icons/mob/animal.dmi' + icon = 'icons/mob/lavaland/lavaland_monsters.dmi' icon_state = "Basilisk" icon_living = "Basilisk" icon_aggro = "Basilisk_alert" @@ -29,15 +30,16 @@ vision_range = 2 aggro_vision_range = 9 turns_per_move = 5 - loot = list(/obj/item/stack/ore/diamond{layer = 4.1}, - /obj/item/stack/ore/diamond{layer = 4.1}) + gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE + loot = list(/obj/item/stack/ore/diamond{layer = ABOVE_MOB_LAYER}, + /obj/item/stack/ore/diamond{layer = ABOVE_MOB_LAYER}) /obj/item/projectile/temp/basilisk name = "freezing blast" icon_state = "ice_2" damage = 0 damage_type = BURN - nodamage = 1 + nodamage = TRUE flag = "energy" temperature = 50 @@ -48,13 +50,14 @@ /mob/living/simple_animal/hostile/asteroid/basilisk/ex_act(severity) switch(severity) - if(1.0) + if(1) gib() - if(2.0) + if(2) adjustBruteLoss(140) - if(3.0) + if(3) adjustBruteLoss(110) +//Watcher /mob/living/simple_animal/hostile/asteroid/basilisk/watcher name = "watcher" desc = "A levitating, eye-like creature held aloft by winglike formations of sinew. A sharp spine of crystal protrudes from its body." @@ -71,14 +74,14 @@ a_intent = INTENT_HARM speak_emote = list("telepathically cries") attack_sound = 'sound/weapons/bladeslice.ogg' - stat_attack = 1 + stat_attack = UNCONSCIOUS flying = TRUE robust_searching = 1 crusher_loot = /obj/item/crusher_trophy/watcher_wing loot = list() butcher_results = list(/obj/item/stack/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1) -/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/Initialize() +/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random/Initialize(mapload) . = ..() if(prob(1)) if(prob(75)) @@ -98,7 +101,7 @@ health = 215 light_range = 3 light_power = 2.5 - light_color = LIGHT_COLOR_ORANGE + light_color = LIGHT_COLOR_LAVA projectiletype = /obj/item/projectile/temp/basilisk/magmawing crusher_loot = /obj/item/crusher_trophy/blaster_tubes/magma_wing crusher_drop_mod = 60 diff --git a/code/modules/mob/living/simple_animal/hostile/mining/goldgrub.dm b/code/modules/mob/living/simple_animal/hostile/mining/goldgrub.dm index 9066b84b5f6..ea73bfb8840 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/goldgrub.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/goldgrub.dm @@ -1,14 +1,14 @@ +//An ore-devouring but easily scared creature /mob/living/simple_animal/hostile/asteroid/goldgrub name = "goldgrub" desc = "A worm that grows fat from eating everything in its sight. Seems to enjoy precious metals and other shiny things, hence the name." - icon = 'icons/mob/animal.dmi' + icon = 'icons/mob/lavaland/lavaland_monsters.dmi' icon_state = "Goldgrub" icon_living = "Goldgrub" icon_aggro = "Goldgrub_alert" icon_dead = "Goldgrub_dead" icon_gib = "syndicate_gib" vision_range = 2 - vision_range = 2 aggro_vision_range = 9 move_to_delay = 5 friendly = "harmlessly rolls into" @@ -22,6 +22,7 @@ a_intent = INTENT_HELP speak_emote = list("screeches") throw_message = "sinks in slowly, before being pushed out of " + deathmessage = "spits up the contents of its stomach before dying!" status_flags = CANPUSH search_objects = 1 wanted_objects = list(/obj/item/stack/ore/diamond, /obj/item/stack/ore/gold, /obj/item/stack/ore/silver, @@ -30,8 +31,8 @@ var/chase_time = 100 var/will_burrow = TRUE -/mob/living/simple_animal/hostile/asteroid/goldgrub/New() - ..() +/mob/living/simple_animal/hostile/asteroid/goldgrub/Initialize(mapload) + . = ..() var/i = rand(1,3) while(i) loot += pick(/obj/item/stack/ore/silver, /obj/item/stack/ore/gold, /obj/item/stack/ore/uranium, /obj/item/stack/ore/diamond) @@ -56,24 +57,22 @@ return return ..() -/mob/living/simple_animal/hostile/asteroid/goldgrub/proc/EatOre(var/atom/targeted_ore) +/mob/living/simple_animal/hostile/asteroid/goldgrub/proc/EatOre(atom/targeted_ore) for(var/obj/item/stack/ore/O in get_turf(targeted_ore)) - if(loot.len < 10) - var/using = min(10 - loot.len, O.amount) + if(length(loot) < 10) + var/using = min(10 - length(loot), O.amount) for(var/i in 1 to using) loot += O.type O.use(using) visible_message("The ore was swallowed whole!") - /mob/living/simple_animal/hostile/asteroid/goldgrub/proc/Burrow()//Begin the chase to kill the goldgrub in time if(!stat) visible_message("The [name] buries into the ground, vanishing from sight!") qdel(src) /mob/living/simple_animal/hostile/asteroid/goldgrub/bullet_act(obj/item/projectile/P) - visible_message("The [P.name] was repelled by [src.name]'s girth!") - return + visible_message("[P.name] was repelled by [name]'s girth!") /mob/living/simple_animal/hostile/asteroid/goldgrub/adjustHealth(amount, updating_health = TRUE) vision_range = 9 diff --git a/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm index 323976003b8..490e056e62f 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm @@ -1,14 +1,14 @@ +//A slow but strong beast that tries to stun using its tentacles /mob/living/simple_animal/hostile/asteroid/goliath name = "goliath" desc = "A massive beast that uses long tentacles to ensare its prey, threatening them is not advised under any conditions." - icon = 'icons/mob/animal.dmi' + icon = 'icons/mob/lavaland/lavaland_monsters.dmi' icon_state = "Goliath" icon_living = "Goliath" icon_aggro = "Goliath_alert" icon_dead = "Goliath_dead" icon_gib = "syndicate_gib" - attack_sound = 'sound/weapons/punch4.ogg' - mouse_opacity = MOUSE_OPACITY_OPAQUE + mouse_opacity = MOUSE_OPACITY_ICON move_to_delay = 40 ranged = TRUE ranged_cooldown_time = 120 @@ -46,17 +46,21 @@ icon_state = pre_attack_icon /mob/living/simple_animal/hostile/asteroid/goliath/revive() - move_force = MOVE_FORCE_VERY_STRONG - move_resist = MOVE_FORCE_VERY_STRONG - pull_force = MOVE_FORCE_VERY_STRONG ..() + anchored = TRUE + +/mob/living/simple_animal/hostile/asteroid/goliath/death(gibbed) + move_force = MOVE_FORCE_DEFAULT + move_resist = MOVE_RESIST_DEFAULT + pull_force = PULL_FORCE_DEFAULT + ..(gibbed) /mob/living/simple_animal/hostile/asteroid/goliath/OpenFire() var/tturf = get_turf(target) if(!isturf(tturf)) return if(get_dist(src, target) <= 7)//Screen range check, so you can't get tentacle'd offscreen - visible_message("The [src.name] digs its tentacles under [target.name]!") + visible_message("[src] digs its tentacles under [target]!") new /obj/effect/temp_visual/goliath_tentacle/original(tturf, src) ranged_cooldown = world.time + ranged_cooldown_time icon_state = icon_aggro @@ -73,7 +77,7 @@ if(icon_state != icon_aggro) icon_state = icon_aggro -// Lavaland Goliath +//Lavaland Goliath /mob/living/simple_animal/hostile/asteroid/goliath/beast name = "goliath" desc = "A hulking, armor-plated beast with long tendrils arching from its back." @@ -87,10 +91,10 @@ crusher_loot = /obj/item/crusher_trophy/goliath_tentacle butcher_results = list(/obj/item/reagent_containers/food/snacks/goliath = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 1, /obj/item/stack/sheet/bone = 2) loot = list() - stat_attack = TRUE + stat_attack = UNCONSCIOUS robust_searching = TRUE -/mob/living/simple_animal/hostile/asteroid/goliath/beast/random/Initialize() +/mob/living/simple_animal/hostile/asteroid/goliath/beast/random/Initialize(mapload) . = ..() if(prob(1)) new /mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient(loc) @@ -110,6 +114,7 @@ throw_message = "does nothing to the rocky hide of the" loot = list(/obj/item/stack/sheet/animalhide/goliath_hide) //A throwback to the asteroid days butcher_results = list(/obj/item/reagent_containers/food/snacks/goliath = 2, /obj/item/stack/sheet/bone = 2) + crusher_drop_mod = 30 wander = FALSE var/list/cached_tentacle_turfs var/turf/last_location @@ -136,7 +141,7 @@ /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril fromtendril = TRUE -// Tentacles +//Tentacles /obj/effect/temp_visual/goliath_tentacle name = "goliath tentacle" icon = 'icons/mob/lavaland/lavaland_monsters.dmi' diff --git a/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm index 23a900c1519..da6a1b4996b 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm @@ -1,3 +1,4 @@ +//Gutlunches, passive mods that devour blood and gibs /mob/living/simple_animal/hostile/asteroid/gutlunch name = "gutlunch" desc = "A scavenger that eats raw meat, often found alongside ash walkers. Produces a thick, nutritious milk." @@ -5,49 +6,47 @@ icon_state = "gutlunch" icon_living = "gutlunch" icon_dead = "gutlunch" - icon_aggro = "gutlunch" speak_emote = list("warbles", "quavers") emote_hear = list("trills.") emote_see = list("sniffs.", "burps.") weather_immunities = list("lava","ash") faction = list("mining", "ashwalker") - density = 0 + density = FALSE speak_chance = 1 turns_per_move = 8 obj_damage = 0 - environment_smash = 0 + environment_smash = ENVIRONMENT_SMASH_NONE move_to_delay = 15 response_help = "pets" response_disarm = "gently pushes aside" response_harm = "squishes" friendly = "pinches" a_intent = INTENT_HELP - ventcrawler = 2 - gold_core_spawnable = 2 - stat_attack = 1 + ventcrawler = VENTCRAWLER_ALWAYS + gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY + stat_attack = UNCONSCIOUS gender = NEUTER stop_automated_movement = FALSE stop_automated_movement_when_pulled = TRUE stat_exclusive = TRUE robust_searching = TRUE - search_objects = 3 + search_objects = 3 //Ancient simplemob AI shitcode. This makes them ignore all other mobs. del_on_death = TRUE loot = list(/obj/effect/decal/cleanable/blood/gibs) deathmessage = "is pulped into bugmash." animal_species = /mob/living/simple_animal/hostile/asteroid/gutlunch - childtype = list(/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck = 45, /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen = 55) + childtype = list(/mob/living/simple_animal/hostile/asteroid/gutlunch/grublunch = 100) wanted_objects = list(/obj/effect/decal/cleanable/blood/gibs, /obj/item/organ/internal) var/obj/item/udder/gutlunch/udder = null -/mob/living/simple_animal/hostile/asteroid/gutlunch/New() +/mob/living/simple_animal/hostile/asteroid/gutlunch/Initialize(mapload) udder = new() - ..() + . = ..() /mob/living/simple_animal/hostile/asteroid/gutlunch/Destroy() - qdel(udder) - udder = null + QDEL_NULL(udder) return ..() /mob/living/simple_animal/hostile/asteroid/gutlunch/regenerate_icons() @@ -96,7 +95,8 @@ /obj/item/udder/gutlunch name = "nutrient sac" -/obj/item/udder/gutlunch/New() +/obj/item/udder/gutlunch/Initialize(mapload) + . = ..() reagents = new(50) reagents.my_atom = src @@ -112,8 +112,8 @@ name = "gubbuck" gender = MALE -/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck/New() - ..() +/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck/Initialize(mapload) + . = ..() add_atom_colour(pick("#E39FBB", "#D97D64", "#CF8C4A"), FIXED_COLOUR_PRIORITY) resize = 0.85 update_transform() @@ -133,3 +133,34 @@ if(.) udder.reagents.clear_reagents() regenerate_icons() + +/mob/living/simple_animal/hostile/asteroid/gutlunch/grublunch + name = "grublunch" + wanted_objects = list() //They don't eat. + gold_core_spawnable = CHEM_MOB_SPAWN_INVALID + var/growth = 0 + +//Baby gutlunch +/mob/living/simple_animal/hostile/asteroid/gutlunch/grublunch/Initialize(mapload) + . = ..() + add_atom_colour("#9E9E9E", FIXED_COLOUR_PRIORITY) //Somewhat hidden + resize = 0.45 + update_transform() + +/mob/living/simple_animal/hostile/asteroid/gutlunch/grublunch/Life() + ..() + growth++ + if(growth > 50) //originally used a timer for this but was more problem that it's worth. + growUp() + +/mob/living/simple_animal/hostile/asteroid/gutlunch/grublunch/proc/growUp() + var/mob/living/L + if(prob(45)) + L = new /mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck(loc) + else + L = new /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen(loc) + mind?.transfer_to(L) + L.faction = faction.Copy() + L.setDir(dir) + visible_message("[src] grows up into [L].") + qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm index 30dd6783717..e4f40f973fd 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm @@ -11,13 +11,11 @@ move_to_delay = 14 ranged = 1 vision_range = 5 - vision_range = 5 aggro_vision_range = 9 speed = 3 maxHealth = 75 health = 75 harm_intent_damage = 5 - obj_damage = 0 melee_damage_lower = 0 melee_damage_upper = 0 attacktext = "lashes out at" @@ -26,16 +24,18 @@ throw_message = "falls right through the strange body of the" ranged_cooldown = 0 ranged_cooldown_time = 20 - environment_smash = 0 + obj_damage = 0 + environment_smash = ENVIRONMENT_SMASH_NONE retreat_distance = 3 minimum_distance = 3 pass_flags = PASSTABLE - loot = list(/obj/item/organ/internal/hivelord_core) + loot = list(/obj/item/organ/internal/regenerative_core) var/brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood /mob/living/simple_animal/hostile/asteroid/hivelord/OpenFire(the_target) if(world.time >= ranged_cooldown) - var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/A = new brood_type(src.loc) + var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/A = new brood_type(loc) + A.admin_spawned = admin_spawned A.GiveTarget(target) A.friends = friends @@ -56,6 +56,7 @@ return FALSE mouse_opacity = MOUSE_OPACITY_ICON +//A fragile but rapidly produced creature /mob/living/simple_animal/hostile/asteroid/hivelordbrood name = "hivelord brood" desc = "A fragment of the original Hivelord, rallying behind its original. One isn't much of a threat, but..." @@ -72,7 +73,7 @@ speed = 3 maxHealth = 1 health = 1 - flying = 1 + flying = TRUE harm_intent_damage = 5 melee_damage_lower = 2 melee_damage_upper = 2 @@ -80,14 +81,17 @@ speak_emote = list("telepathically cries") attack_sound = 'sound/weapons/pierce.ogg' throw_message = "falls right through the strange body of the" - environment_smash = 0 - pass_flags = PASSTABLE + obj_damage = 0 + environment_smash = ENVIRONMENT_SMASH_NONE + pass_flags = PASSTABLE | PASSMOB + density = FALSE del_on_death = 1 -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/New() - ..() +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/Initialize(mapload) + . = ..() addtimer(CALLBACK(src, .proc/death), 100) + /mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood name = "blood brood" desc = "A living string of blood and alien materials." @@ -103,9 +107,9 @@ reagents.reaction(get_turf(src)) return ..() -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/New() +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/Initialize(mapload) + . = ..() create_reagents(30) - ..() /mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/AttackingTarget() ..() @@ -145,7 +149,7 @@ C.transfer_blood_to(src, 30) color = mix_color_from_reagents(reagents.reagent_list) -// Legion +//Legion /mob/living/simple_animal/hostile/asteroid/hivelord/legion name = "legion" desc = "You can still see what was once a person under the shifting mass of corruption." @@ -155,6 +159,8 @@ icon_aggro = "legion" icon_dead = "legion" icon_gib = "syndicate_gib" + mouse_opacity = MOUSE_OPACITY_ICON + obj_damage = 60 melee_damage_lower = 15 melee_damage_upper = 15 attacktext = "lashes out at" @@ -162,15 +168,15 @@ attack_sound = 'sound/weapons/pierce.ogg' throw_message = "bounces harmlessly off of" crusher_loot = /obj/item/crusher_trophy/legion_skull - loot = list(/obj/item/organ/internal/hivelord_core/legion) + loot = list(/obj/item/organ/internal/regenerative_core/legion) brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion del_on_death = 1 - stat_attack = 1 + stat_attack = UNCONSCIOUS robust_searching = 1 var/dwarf_mob = FALSE var/mob/living/carbon/human/stored_mob -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/Initialize() +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/random/Initialize(mapload) . = ..() if(prob(5)) new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(loc) @@ -186,6 +192,7 @@ maxHealth = 60 health = 60 speed = 2 //faster! + crusher_drop_mod = 20 dwarf_mob = TRUE /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril @@ -206,7 +213,7 @@ new /obj/effect/mob_spawn/human/corpse/damaged/legioninfested(T) ..(gibbed) - +//Legion skull /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion name = "legion" desc = "One of many." @@ -227,15 +234,15 @@ speak_emote = list("echoes") attack_sound = 'sound/weapons/pierce.ogg' throw_message = "is shrugged off by" - pass_flags = PASSTABLE - del_on_death = 1 - stat_attack = 1 + del_on_death = TRUE + stat_attack = UNCONSCIOUS robust_searching = 1 + var/can_infest_dead = FALSE /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/Life(seconds, times_fired) if(isturf(loc)) for(var/mob/living/carbon/human/H in view(src,1)) //Only for corpse right next to/on same tile - if(H.stat == UNCONSCIOUS) + if(H.stat == UNCONSCIOUS || (can_infest_dead && H.stat == DEAD)) infest(H) ..() @@ -253,13 +260,28 @@ H.forceMove(L) qdel(src) +//Advanced Legion is slightly tougher to kill and can raise corpses (revive other legions) +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/advanced + stat_attack = DEAD + maxHealth = 120 + health = 120 + brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced + icon_state = "dwarf_legion" + icon_living = "dwarf_legion" + icon_aggro = "dwarf_legion" + icon_dead = "dwarf_legion" + +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced + stat_attack = DEAD + can_infest_dead = TRUE + /obj/item/legion_skull name = "legion's head" desc = "The once living, now empty eyes of the former human's skull cut deep into your soul." icon = 'icons/obj/mining.dmi' icon_state = "skull" - +//Tendril-spawned Legion remains, the charred skeletons of those whose bodies sank into laval or fell into chasms. /obj/effect/mob_spawn/human/corpse/charredskeleton name = "charred skeletal remains" burn_damage = 1000 @@ -278,22 +300,22 @@ genemutcheck(H, SMALLSIZEBLOCK, null, MUTCHK_FORCED) H.update_mutations() -/obj/effect/mob_spawn/human/corpse/damaged/legioninfested/Initialize() +/obj/effect/mob_spawn/human/corpse/damaged/legioninfested/Initialize(mapload) var/type = pickweight(list("Miner" = 66, "Ashwalker" = 10, "Golem" = 10,"Clown" = 10, pick(list("Shadow", "YeOlde","Operative", "Cultist")) = 4)) switch(type) if("Miner") mob_species = pickweight(list(/datum/species/human = 72, /datum/species/unathi = 28)) uniform = /obj/item/clothing/under/rank/miner/lavaland - if (prob(4)) - belt = /obj/item/storage/belt/mining + if(prob(4)) + belt = pickweight(list(/obj/item/storage/belt/mining = 2, /obj/item/storage/belt/mining/alt = 2)) else if(prob(10)) - belt = pickweight(list(/obj/item/pickaxe = 8, /obj/item/pickaxe/silver = 2, /obj/item/pickaxe/diamond = 1)) + belt = pickweight(list(/obj/item/pickaxe = 8, /obj/item/pickaxe/mini = 4, /obj/item/pickaxe/silver = 2, /obj/item/pickaxe/diamond = 1)) else belt = /obj/item/tank/emergency_oxygen/engi if(mob_species != /datum/species/unathi) shoes = /obj/item/clothing/shoes/workboots/mining - gloves = /obj/item/clothing/gloves/color/black - mask = /obj/item/clothing/mask/gas/explorer + gloves = /obj/item/clothing/gloves/color/black + mask = /obj/item/clothing/mask/gas/explorer if(prob(20)) suit = pickweight(list(/obj/item/clothing/suit/hooded/explorer = 18, /obj/item/clothing/suit/hooded/goliath = 2)) if(prob(30)) @@ -308,10 +330,11 @@ else head = /obj/item/clothing/head/helmet/skull suit = /obj/item/clothing/suit/armor/bone + gloves = /obj/item/clothing/gloves/bracer if(prob(5)) back = pickweight(list(/obj/item/twohanded/spear/bonespear = 3, /obj/item/twohanded/fireaxe/boneaxe = 2)) if(prob(10)) - belt = /obj/item/storage/belt/mining + belt = /obj/item/storage/belt/mining/primitive if(prob(30)) r_pocket = /obj/item/kitchen/knife/combat/survival/bone if(prob(30)) @@ -332,7 +355,7 @@ if(prob(30)) glasses = pickweight(list(/obj/item/clothing/glasses/meson = 2, /obj/item/clothing/glasses/hud/health = 2, /obj/item/clothing/glasses/hud/diagnostic =2, /obj/item/clothing/glasses/science = 2, /obj/item/clothing/glasses/welding = 2, /obj/item/clothing/glasses/night = 1)) if(prob(10)) - belt = pick(list(/obj/item/storage/belt/mining, /obj/item/storage/belt/utility/full)) + belt = pick(list(/obj/item/storage/belt/mining/vendor, /obj/item/storage/belt/utility/full)) if(prob(50)) back = /obj/item/bedsheet/rd/royal_cape if(prob(10)) @@ -362,7 +385,6 @@ if("Cultist") uniform = /obj/item/clothing/under/roman suit = /obj/item/clothing/suit/hooded/cultrobes - head = /obj/item/clothing/head/hooded/culthood suit_store = /obj/item/tome r_pocket = /obj/item/restraints/legcuffs/bola/cult l_pocket = /obj/item/melee/cultblade/dagger diff --git a/code/modules/mob/living/simple_animal/hostile/mining/mining.dm b/code/modules/mob/living/simple_animal/hostile/mining/mining.dm index ba4f00503e1..00e2d241923 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/mining.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/mining.dm @@ -1,13 +1,13 @@ +//the base mining mob /mob/living/simple_animal/hostile/asteroid vision_range = 2 atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - unsuitable_atmos_damage = 15 faction = list("mining") weather_immunities = list("lava","ash") obj_damage = 30 - environment_smash = 2 + environment_smash = ENVIRONMENT_SMASH_WALLS minbodytemp = 0 - heat_damage_per_tick = 20 + maxbodytemp = INFINITY response_help = "pokes" response_disarm = "shoves" response_harm = "strikes" @@ -15,15 +15,15 @@ a_intent = INTENT_HARM var/crusher_loot var/throw_message = "bounces off of" - var/icon_aggro = null // for swapping to when we get aggressive var/fromtendril = FALSE see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE mob_size = MOB_SIZE_LARGE + var/icon_aggro = null var/crusher_drop_mod = 25 -/mob/living/simple_animal/hostile/asteroid/New() - ..() +/mob/living/simple_animal/hostile/asteroid/Initialize(mapload) + . = ..() apply_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING) /mob/living/simple_animal/hostile/asteroid/Aggro() @@ -37,12 +37,12 @@ return icon_state = icon_living -/mob/living/simple_animal/hostile/asteroid/bullet_act(var/obj/item/projectile/P)//Reduces damage from most projectiles to curb off-screen kills +/mob/living/simple_animal/hostile/asteroid/bullet_act(obj/item/projectile/P)//Reduces damage from most projectiles to curb off-screen kills if(!stat) Aggro() if(P.damage < 30 && P.damage_type != BRUTE) P.damage = (P.damage / 3) - visible_message("The [P] has a reduced effect on [src]!") + visible_message("[P] has a reduced effect on [src]!") ..() /mob/living/simple_animal/hostile/asteroid/hitby(atom/movable/AM)//No floor tiling them to death, wiseguy @@ -62,4 +62,10 @@ ..(gibbed) /mob/living/simple_animal/hostile/asteroid/proc/spawn_crusher_loot() - butcher_results[crusher_loot] = 1 \ No newline at end of file + butcher_results[crusher_loot] = 1 + +/mob/living/simple_animal/hostile/asteroid/handle_temperature_damage() + if(bodytemperature < minbodytemp) + adjustBruteLoss(2) + else if(bodytemperature > maxbodytemp) + adjustBruteLoss(20) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/mining/necropolis_tendril.dm b/code/modules/mob/living/simple_animal/hostile/mining/necropolis_tendril.dm index e910bac7ca3..50b1f956289 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/necropolis_tendril.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/necropolis_tendril.dm @@ -23,17 +23,17 @@ del_on_death = 1 var/gps = null -/mob/living/simple_animal/hostile/spawner/lavaland/New() - ..() +/mob/living/simple_animal/hostile/spawner/lavaland/Initialize(mapload) + . = ..() //for(var/F in RANGE_TURFS(1, src)) TODO: Uncomment //if(ismineralturf(F)) - //var/turf/simulated/mineral/M = F + //var/turf/simulated/mineral/M = F //M.ChangeTurf(M.turf_type, FALSE, TRUE) gps = new /obj/item/gps/internal(src) /mob/living/simple_animal/hostile/spawner/lavaland/Destroy() - qdel(gps) - . = ..() + QDEL_NULL(gps) + return ..() /mob/living/simple_animal/hostile/spawner/lavaland/death() var/last_tendril = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index ce044284a26..99689bf5040 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -21,7 +21,7 @@ attack_sound = 'sound/weapons/bite.ogg' faction = list("mushroom") environment_smash = 0 - stat_attack = 2 + stat_attack = DEAD mouse_opacity = MOUSE_OPACITY_ICON speed = 1 ventcrawler = 2 diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index f380d85be34..3d1bc42a190 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -78,7 +78,7 @@ name = "Syndicate Operative" force_threshold = 6 // Prevents people using punches to bypass eshield robust_searching = 1 // Together with stat_attack, ensures dionae/etc that regen are killed properly - stat_attack = 1 + stat_attack = UNCONSCIOUS universal_speak = 1 melee_block_chance = 40 del_on_death = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/black.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/black.dm index bc568496236..fb4c0e4308e 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/black.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/black.dm @@ -22,7 +22,7 @@ melee_damage_lower = 5 melee_damage_upper = 10 web_type = /obj/structure/spider/terrorweb/black - stat_attack = 1 // ensures they will target people in crit, too! + stat_attack = UNCONSCIOUS // ensures they will target people in crit, too! spider_tier = TS_TIER_2 diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/gray.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/gray.dm index 9a986d1d4b0..36ec67df0cd 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/gray.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/gray.dm @@ -21,7 +21,7 @@ melee_damage_lower = 10 melee_damage_upper = 20 regen_points_per_hp = 2 // 50% higher regen speed - stat_attack = 1 // ensures they will target people in crit, too! + stat_attack = UNCONSCIOUS // ensures they will target people in crit, too! wander = 0 // wandering defeats the purpose of stealth vision_range = 3 // very low idle vision range delay_web = 20 // double speed diff --git a/code/modules/paperwork/contract.dm b/code/modules/paperwork/contract.dm index c1124bee744..55f220153b1 100644 --- a/code/modules/paperwork/contract.dm +++ b/code/modules/paperwork/contract.dm @@ -272,7 +272,7 @@ if(ishuman(user)) var/mob/living/carbon/human/H = user H.update_body() - var/obj/item/organ/internal/hivelord_core/organ = new /obj/item/organ/internal/hivelord_core + var/obj/item/organ/internal/regenerative_core/organ = new /obj/item/organ/internal/regenerative_core organ.insert(user) return ..() diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index eb80e41a87f..6666d3cf4d2 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index 5c272f8c8e9..f9c59529b28 100644 Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ diff --git a/icons/mob/lavaland/lavaland_monsters.dmi b/icons/mob/lavaland/lavaland_monsters.dmi index 27f09173518..30750b216da 100644 Binary files a/icons/mob/lavaland/lavaland_monsters.dmi and b/icons/mob/lavaland/lavaland_monsters.dmi differ diff --git a/icons/mob/lavaland/watcher.dmi b/icons/mob/lavaland/watcher.dmi index a357e82a13f..df4bbb61820 100644 Binary files a/icons/mob/lavaland/watcher.dmi and b/icons/mob/lavaland/watcher.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index 58e078b223c..2521d36697d 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ