From 214b4f7806504022ece20702132204bf699ad9a4 Mon Sep 17 00:00:00 2001 From: Kyep Date: Sun, 28 Aug 2016 19:20:16 -0700 Subject: [PATCH 01/15] Simple Terror Spiders Simple, minimalist version of Terror Spiders. Intended to be the first part of a new series of PRs that implements Terror Spiders piece by piece. This PR only includes: - Core mechanics: ventcrawling, shared language, slow regen - 4 spider types: T1 Red (tank), T1 Gray (stealth), T2 Black (poison), T3 Prince (boss) There's no AI, hive/leadership system, reproduction, awaymission, etc in this PR. That's how this PR is ~500 lines, where the previous one was >5,100 lines. --- code/modules/mob/language.dm | 13 + .../hostile/terror_spiders/__defines.dm | 16 + .../hostile/terror_spiders/black.dm | 51 +++ .../hostile/terror_spiders/chem.dm | 43 +++ .../hostile/terror_spiders/ghost.dm | 44 +++ .../hostile/terror_spiders/gray.dm | 48 +++ .../hostile/terror_spiders/prince.dm | 47 +++ .../hostile/terror_spiders/red.dm | 70 ++++ .../hostile/terror_spiders/terror_spiders.dm | 328 ++++++++++++++++++ .../hostile/terror_spiders/verbs.dm | 160 +++++++++ goon/browserassets/css/browserOutput.css | 2 + icons/mob/terrorspider.dmi | Bin 0 -> 35431 bytes paradise.dme | 9 + 13 files changed, 831 insertions(+) create mode 100644 code/modules/mob/living/simple_animal/hostile/terror_spiders/__defines.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/terror_spiders/black.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/terror_spiders/gray.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm create mode 100644 icons/mob/terrorspider.dmi diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index abe6742fecc..21c7362e879 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -428,6 +428,19 @@ flags = RESTRICTED | HIVEMIND follow = 1 + +/datum/language/terrorspider + name = "TerrorSpider" + desc = "Terror spiders have a limited ability to commune over a psychic hivemind, similar to xenomorphs." + speech_verb = "chitters" + ask_verb = "chitters" + exclaim_verb = "chitters" + colour = "terrorspider" + key = "ts" + flags = RESTRICTED | HIVEMIND + follow = 1 + + /datum/language/ling name = "Changeling" desc = "Although they are normally wary and suspicious of each other, changelings can commune over a distance." diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/__defines.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/__defines.dm new file mode 100644 index 00000000000..d86332ab32d --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/__defines.dm @@ -0,0 +1,16 @@ + +#define SPINNING_WEB 1 +#define LAYING_EGGS 2 +#define MOVING_TO_TARGET 3 +#define SPINNING_COCOON 4 + + +#define TS_DESC_RED "Red - Assault" +#define TS_DESC_BLACK "Black - Poison" +#define TS_DESC_PURPLE "Purple - Guard" + +#define TS_TIER_1 1 +#define TS_TIER_2 2 +#define TS_TIER_3 3 +#define TS_TIER_4 4 +#define TS_TIER_5 5 \ No newline at end of file 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 new file mode 100644 index 00000000000..6e1dbbdf5a0 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/black.dm @@ -0,0 +1,51 @@ + +// -------------------------------------------------------------------------------- +// ----------------- TERROR SPIDERS: T2 BLACK TERROR ------------------------------ +// -------------------------------------------------------------------------------- +// -------------: ROLE: assassin, poisoner, DoT expert +// -------------: AI: attacks to inject its venom, then retreats. Will inject its enemies multiple times then hang back to ensure they die. +// -------------: SPECIAL: venom that does more damage the more of it is in you +// -------------: TO FIGHT IT: if bitten once, retreat, get charcoal/etc treatment, and come back with a gun. +// -------------: CONCEPT: http://tvtropes.org/pmwiki/pmwiki.php/Main/GradualGrinder +// -------------: SPRITES FROM: Travelling Merchant, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=2766 + +/mob/living/simple_animal/hostile/poison/terror_spider/black + name = "Black Terror spider" + desc = "An ominous-looking spider, black as the darkest night, and with merciless yellow eyes." + altnames = list("Black Devil spider", "Giant Black Widow spider", "Shadow Terror spider") + spider_role_summary = "Hit-and-run attacker with extremely venomous bite." + + icon_state = "terror_black" + icon_living = "terror_black" + icon_dead = "terror_black_dead" + maxHealth = 120 // same health as hunter spider, aka, pretty weak.. but its bite will kill you! + health = 120 + melee_damage_lower = 5 + melee_damage_upper = 10 + move_to_delay = 5 + stat_attack = 1 // ensures they will target people in crit, too! + spider_tier = TS_TIER_2 + + + +/mob/living/simple_animal/hostile/poison/terror_spider/black/ShowGuide() + ..() + var/guidetext = "BLACK TERROR guide:" + guidetext += "
- You are an assassin. Even 2-3 bites from you is fatal to organic humanoids - if you back off and let your poison work. You are very vulnurable to mechs and borgs." + guidetext += "
- Try to bite a few times and retreat quickly. You will die if you stick around. You are very dangerous and should expect crew to focus fire on you." + to_chat(src, guidetext) + +/mob/living/simple_animal/hostile/poison/terror_spider/black/spider_specialattack(var/mob/living/carbon/human/L, var/poisonable) + if(!poisonable) + ..() + return ..() + if(L.reagents.has_reagent("terror_black_toxin", 50)) + L.attack_animal(src) + return ..() + var/inject_target = pick("chest", "head") + if(L.stunned || L.can_inject(null, 0, inject_target, 0)) + L.reagents.add_reagent("terror_black_toxin", 15) // inject our special poison + visible_message("[src] buries its long fangs deep into the [inject_target] of [target]!") + else + visible_message("[src] bites [target], but cannot inject venom into their [inject_target]!") + L.attack_animal(src) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm new file mode 100644 index 00000000000..4dadffd17bf --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm @@ -0,0 +1,43 @@ +#define SOLID 1 +#define LIQUID 2 +#define GAS 3 +#define FOOD_METABOLISM 0.4 +#define REM REAGENTS_EFFECT_MULTIPLIER + + +// Terror Spider, Black, Deadly Venom + +/datum/reagent/terror_black_toxin + name = "Black Widow venom" + id = "terror_black_toxin" + description = "An incredibly toxic venom injected by the Black Widow spider." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.1 + +/datum/reagent/terror_black_toxin/on_mob_life(var/mob/living/M) + if(!M) + M = holder.my_atom + if(volume < 15) + // bitten once, die slowly. Easy to survive a single bite - just go to medbay. + // total damage: 2/tick, human health 150 until crit, = 75 ticks, = 150 seconds = 2.5 minutes to get to medbay. + M.adjustToxLoss(2) // same damage/tick as tabun cycle 0 to 60 + else if(volume < 30) + // bitten twice, die more quickly, muscle cramps make movement difficult. Call medics immediately. + // total damage: 4, human health 150 until crit, = 37.5 ticks, = 75s = 1m15s until death + M.adjustToxLoss(4) + M.confused = max(M.confused, 3) + M.eye_blurry = max(M.eye_blurry, 3) + else if(volume < 45) + // bitten thrice, die very quickly, severe muscle cramps make movement very difficult. Even calling for help probably won't save you. + // total damage: 8, human health 150 until crit, = 18.75 ticks, = 37s until death + M.adjustToxLoss(8) // a bit worse than coiine + M.confused = max(M.confused, 6) + M.eye_blurry = max(M.eye_blurry, 6) + else + // bitten 4 or more times, whole body goes into shock/death + // total damage: 12, human health 150 until crit, = 12.5 ticks, = 25s until death + M.adjustToxLoss(12) + M.eye_blurry = max(M.eye_blurry, 9) + M.Paralyse(5) + ..() diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm new file mode 100644 index 00000000000..90b485cfb6a --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm @@ -0,0 +1,44 @@ + +/mob/living/simple_animal/hostile/poison/terror_spider/Topic(href, href_list) + if(href_list["activate"]) + var/mob/dead/observer/ghost = usr + if(istype(ghost)) + humanize_spider(ghost) + +/mob/living/simple_animal/hostile/poison/terror_spider/attack_ghost(mob/user) + humanize_spider(user) + +/mob/living/simple_animal/hostile/poison/terror_spider/proc/humanize_spider(mob/user) + if(key)//Someone is in it + return + var/error_on_humanize = "" + var/humanize_prompt = "Take direct control of " + src.name + "? " + humanize_prompt += "Role: " + spider_role_summary + if(user.ckey in ts_ckey_blacklist) + error_on_humanize = "You are not able to control any terror spider this round." + else if(!ai_playercontrol_allowingeneral) + error_on_humanize = "Terror spiders cannot currently be player-controlled." + else if(spider_awaymission) + error_on_humanize = "Terror spiders that are part of an away mission cannot be controlled by ghosts." + else if(!ai_playercontrol_allowtype) + error_on_humanize = "This specific type of terror spider is not player-controllable." + else if(health == 0) + error_on_humanize = "Dead spiders are not player-controllable." + if(jobban_isbanned(user, "Syndicate") || jobban_isbanned(user, "alien")) + to_chat(user,"You are jobbanned from role of syndicate and/or alien lifeform.") + return + if(error_on_humanize == "") + var/spider_ask = alert(humanize_prompt, "Join as Terror Spider?", "Yes", "No") + if(spider_ask == "No" || !src || qdeleted(src)) + return + else + to_chat(user, "Cannot inhabit spider: " + error_on_humanize) + return + if(key) + to_chat(user, "Someone else already took this spider.") + return + key = user.key + for(var/mob/dead/observer/G in player_list) + G.show_message("A ghost has taken control of [src]. ([ghost_follow_link(src, ghost=G)]).") + ShowGuide() + 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 new file mode 100644 index 00000000000..5eae1f60bc5 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/gray.dm @@ -0,0 +1,48 @@ + +// -------------------------------------------------------------------------------- +// ----------------- TERROR SPIDERS: T1 GRAY TERROR ------------------------------- +// -------------------------------------------------------------------------------- +// -------------: ROLE: fast, weak terror spider +// -------------: SPECIAL: none +// -------------: TO FIGHT IT: shoot it! +// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386 + +/mob/living/simple_animal/hostile/poison/terror_spider/gray + name = "Gray Terror spider" + desc = "An ominous-looking gray spider, it seems jittery." + altnames = list("Gray Trap spider", "Gray Stalker spider", "Ghostly Ambushing spider") + spider_role_summary = "Fast-moving but weak spider." + icon_state = "terror_gray" + icon_living = "terror_gray" + icon_dead = "terror_gray_dead" + maxHealth = 120 // same health as hunter spider, aka, pretty weak.. but silences its targets + health = 120 + melee_damage_lower = 10 + melee_damage_upper = 20 + ventcrawler = 1 + move_to_delay = 5 // normal speed + stat_attack = 1 // ensures they will target people in crit, too! + environment_smash = 1 + +/mob/living/simple_animal/hostile/poison/terror_spider/gray/ShowGuide() + ..() + var/guidetext = "GRAY TERROR guide:" + guidetext += "
- You are a stealth killer. Your venom silences its targets." + guidetext += "
- You are weak, but fast, and should use webs in corridors to trap your prey, hiding in a vent until they are entangled." + guidetext += "
- Do not attempt to take on well-armed foes without the element of surprise - you will die quickly!" + to_chat(src, guidetext) + +/mob/living/simple_animal/hostile/poison/terror_spider/gray/spider_specialattack(var/mob/living/carbon/human/L, var/poisonable) + if(!poisonable) + ..() + return + if(L.silent >= 10) + L.attack_animal(src) + else + var/inject_target = pick("chest","head") + if(L.stunned || L.can_inject(null,0,inject_target,0)) + L.silent = max(L.silent, 20) // instead of having a venom that only lasts seconds, we just add the silence directly. + visible_message("[src] buries grey fangs deep into the [inject_target] of [target]!") + else + visible_message("[src] bites [target], but cannot inject venom into their [inject_target]!") + L.attack_animal(src) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm new file mode 100644 index 00000000000..ef8919dc3a6 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm @@ -0,0 +1,47 @@ + +// -------------------------------------------------------------------------------- +// ----------------- TERROR SPIDERS: T3 PRINCE OF TERROR -------------------------- +// -------------------------------------------------------------------------------- +// -------------: ROLE: boss +// -------------: AI: no special ai +// -------------: SPECIAL: massive health +// -------------: TO FIGHT IT: a squad of at least 4 people with laser rifles. +// -------------: CONCEPT: http://tvtropes.org/pmwiki/pmwiki.php/Main/LightningBruiser +// -------------: CONCEPT: http://tvtropes.org/pmwiki/pmwiki.php/Main/WakeupCallBoss +// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386 + +/mob/living/simple_animal/hostile/poison/terror_spider/prince + name = "Prince of Terror spider" + desc = "An enormous, terrifying spider. It looks like it is judging everything it sees. Extremely dangerous." + spider_role_summary = "Boss-level terror spider. Lightning bruiser. Capable of taking on a squad by itself." + altnames = list("Prince of Terror", "Terror Prince") + icon_state = "terror_queen" + icon_living = "terror_queen" + icon_dead = "terror_queen_dead" + maxHealth = 400 // 20 laser shots. + health = 400 + melee_damage_lower = 15 + melee_damage_upper = 25 + move_to_delay = 5 + ventcrawler = 1 + loot = list(/obj/item/clothing/accessory/medal) + spider_tier = TS_TIER_3 + spider_opens_doors = 2 + + +/mob/living/simple_animal/hostile/poison/terror_spider/prince/ShowGuide() + ..() + var/guidetext = "PRINCE OF TERROR guide:" + guidetext += "
- A ferocious warrior, you wander the stars, identifying potential nest sites, and threats, for your fellow Terror Spiders." + guidetext += "
- You have been sent to this remote station to determine if it would make a suitable nest." + guidetext += "
- You have lots of health, and decent attacks, but can be killed by a well-armed group." + guidetext += "
- Expect crew to treat you as a level 5 biohazard. Even a single Prince (aka: War Spider) can wreck a station." + to_chat(src, guidetext) + +/mob/living/simple_animal/hostile/poison/terror_spider/prince/spider_specialattack(var/mob/living/carbon/human/L) + if(prob(15)) + visible_message("[src] rams into [L], knocking them to the floor!") + L.Weaken(5) + L.Stun(5) + else + ..() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm new file mode 100644 index 00000000000..96338fd925d --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm @@ -0,0 +1,70 @@ + + +// -------------------------------------------------------------------------------- +// ----------------- TERROR SPIDERS: T1 RED TERROR -------------------------------- +// -------------------------------------------------------------------------------- +// -------------: ROLE: generic attack spider +// -------------: AI: uses very powerful fangs to wreck people in melee +// -------------: SPECIAL: the more you hurt it, the harder it bites you +// -------------: TO FIGHT IT: shoot it from range. Kite it. +// -------------: CONCEPT: http://tvtropes.org/pmwiki/pmwiki.php/Main/MightyGlacier +// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386 + +/mob/living/simple_animal/hostile/poison/terror_spider/red + name = "Red Terror spider" + desc = "An ominous-looking red spider, it has eight beady red eyes, and nasty, big, pointy fangs!" + altnames = list("Red Terror spider", "Crimson Terror spider", "Bloody Butcher spider") + + spider_role_summary = "High health, high damage, very slow, melee juggernaut" + + icon_state = "terror_red" + icon_living = "terror_red" + icon_dead = "terror_red_dead" + maxHealth = 200 + health = 200 + melee_damage_lower = 15 + melee_damage_upper = 20 + move_to_delay = 20 + spider_opens_doors = 2 + var/enrage = 0 + var/melee_damage_lower_rage0 = 15 + var/melee_damage_upper_rage0 = 20 + var/melee_damage_lower_rage1 = 15 + var/melee_damage_upper_rage1 = 35 + var/melee_damage_lower_rage2 = 35 + var/melee_damage_upper_rage2 = 40 + + +/mob/living/simple_animal/hostile/poison/terror_spider/red/AttackingTarget() + if(enrage == 0) + if(health < maxHealth) + enrage = 1 + visible_message("[src] growls, flexing its fangs!") + melee_damage_lower = melee_damage_lower_rage1 + melee_damage_upper = melee_damage_upper_rage1 + else if(enrage == 1) + if(health == maxHealth) + enrage = 0 + visible_message("[src] retracts its fangs a little.") + melee_damage_lower = melee_damage_lower_rage0 + melee_damage_upper = melee_damage_upper_rage0 + else if(health < (maxHealth/2)) + enrage = 2 + visible_message("[src] growls, spreading its fangs wide!") + melee_damage_lower = melee_damage_lower_rage2 + melee_damage_upper = melee_damage_upper_rage2 + else if(enrage == 2) + if(health > (maxHealth/2)) + enrage = 1 + visible_message("[src] retracts its fangs a little.") + melee_damage_lower = melee_damage_lower_rage0 + melee_damage_upper = melee_damage_upper_rage0 + ..() + +/mob/living/simple_animal/hostile/poison/terror_spider/red/ShowGuide() + ..() + var/guidetext = "
RED TERROR guide:" + guidetext += "
- A straightforward fighter, you have high health, and high melee damage, but are very slow-moving." + guidetext += "
- You are best at taking out slow, armored foes. Be careful not to get kited with ranged weapons." + guidetext += "
- You can take a lot of hits, so don't be afraid to act as the tank in a group." + to_chat(src, guidetext) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm new file mode 100644 index 00000000000..1b70a7fc2c5 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -0,0 +1,328 @@ + +var/global/list/ts_ckey_blacklist = list() +var/global/ts_count_dead = 0 +var/global/ts_count_alive_awaymission = 0 +var/global/ts_count_alive_station = 0 +var/global/ts_death_last = 0 +var/global/ts_death_window = 9000 // 15 minutes +var/global/list/ts_spiderlist = list() + +// -------------------------------------------------------------------------------- +// --------------------- TERROR SPIDERS: DEFAULTS --------------------------------- +// -------------------------------------------------------------------------------- +// Because: http://tvtropes.org/pmwiki/pmwiki.php/Main/SpidersAreScary + +/mob/living/simple_animal/hostile/poison/terror_spider/ + // Name / Description + name = "terror spider" + var/altnames = list() + var/name_usealtnames = 0 // if 1, spiders use their randomized names, if not they're all " terror" + desc = "The generic parent of all other terror spider types. If you see this in-game, it is a bug." + + // Icons + icon = 'icons/mob/terrorspider.dmi' + icon_state = "terror_red" + icon_living = "terror_red" + icon_dead = "terror_red_dead" + + // Health + maxHealth = 120 + health = 120 + + // Melee attacks + melee_damage_lower = 15 + melee_damage_upper = 20 + attacktext = "bites" + attack_sound = 'sound/weapons/bite.ogg' + poison_type = "" // we do not use that silly system. + + // Movement + move_to_delay = 6 + turns_per_move = 5 + pass_flags = PASSTABLE + + // Ventcrawling + ventcrawler = 1 // allows player ventcrawling + + // Speech + speak_chance = 0 // quiet but deadly + speak_emote = list("hisses") + emote_hear = list("hisses") + + // Loot + loot = list() + + // Languages are handled in terror_spider/New() + + // Interaction keywords + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "hits" + + // regeneration settings - overridable by child classes + var/regen_points = 0 // number of regen points they have by default + var/regen_points_max = 100 // max number of points they can accumulate + var/regen_points_per_tick = 1 // gain one regen point per tick + var/regen_points_per_kill = 100 // gain extra regen points if you kill something + var/regen_points_per_hp = 2 // every X regen points = 1 health point you can regen + // desired: 30hp/minute unmolested, 60hp/min on food boost, assuming one tick every 2 seconds + // 100/kill means bonus 50hp/kill regenerated over the next 1-2 minutes + + // Vision + idle_vision_range = 10 + aggro_vision_range = 10 + see_in_dark = 10 + nightvision = 1 + vision_type = new /datum/vision_override/nightvision/thermals/ling_augmented_eyesight + see_invisible = 5 + + // player control by ghosts + var/ai_playercontrol_allowingeneral = 1 // if 0, no spiders are player controllable. Default set in code, can be changed by queens. + var/ai_playercontrol_allowtype = 1 // if 0, this specific class of spider is not player-controllable. Default set in code for each class, cannot be changed. + + var/spider_opens_doors = 1 // all spiders can open firedoors (they have no security). 1 = can open depowered doors. 2 = can open powered doors + faction = list("terrorspiders") + var/spider_awaymission = 0 // if 1, limits certain behavior in away missions + var/spider_role_summary = "UNDEFINED" + var/spider_placed = 0 + + // AI variables designed for use in procs + var/atom/cocoon_target // for queen and nurse + var/obj/machinery/atmospherics/unary/vent_pump/entry_vent // nearby vent they are going to try to get to, and enter + var/obj/machinery/atmospherics/unary/vent_pump/exit_vent // remote vent they intend to come out of + var/obj/machinery/atmospherics/unary/vent_pump/nest_vent // home vent, usually used by queens + var/fed = 0 + var/travelling_in_vent = 0 + var/list/nibbled = list() + var/busy = 0 // leave this alone! + var/spider_tier = TS_TIER_1 // 1 for red,gray,green. 2 for purple,black,white, 3 for prince, mother. 4 for queen, 5 for empress. + var/attackstep = 0 + var/attackcycles = 0 + var/mylocation = null + var/chasecycles = 0 + var/last_cocoon_object = 0 // leave this, changed by procs. + var/killcount = 0 + var/hasdroppedloot = 0 + + // Breathing, Pressure & Fire + // - No breathing / cannot be suffocated (spiders can hold their breath, look it up) + // - No pressure damage either - they have effectively exoskeletons + // - HOWEVER they can be burned to death! + // - Normal SPACE spiders should probably be immune to SPACE too, but meh, we try to leave the base spiders alone. + 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) + minbodytemp = 0 + maxbodytemp = 1500 + heat_damage_per_tick = 5 //amount of damage applied if animal's body temperature is higher than maxbodytemp + + // Xenobio Interactions + sentience_type = SENTIENCE_OTHER // prevents people from using a sentience potion on a TS to tame it + + // DEBUG OPTIONS & COMMANDS + var/spider_debug = 0 + + +// -------------------------------------------------------------------------------- +// --------------------- TERROR SPIDERS: SHARED ATTACK CODE ----------------------- +// -------------------------------------------------------------------------------- + + + +/mob/living/simple_animal/hostile/poison/terror_spider/AttackingTarget() + if(istype(target, /mob/living/simple_animal/hostile/poison/terror_spider)) + var/mob/living/simple_animal/hostile/poison/terror_spider/T = target + if(T.spider_tier > spider_tier) + visible_message("[src] bows in respect for the terrifying presence of [target]") + else if(T.spider_tier == spider_tier) + visible_message("[src] harmlessly nuzzles [target].") + else if(T.spider_tier < spider_tier && spider_tier >= 4) + visible_message("[src] gives [target] a stern look.") + else + visible_message("[src] harmlessly nuzzles [target].") + T.CheckFaction() + CheckFaction() + else if(istype(target, /obj/effect/spider/cocoon)) + to_chat(src, "Destroying our own cocoons would not help us.") + else if(istype(target, /obj/machinery/door/firedoor)) + var/obj/machinery/door/firedoor/F = target + if(F.density) + if(F.blocked) + to_chat(src, "The fire door is welded shut.") + else + visible_message("\The [src] pries open the firedoor!") + F.open() + else + to_chat(src, "Closing fire doors does not help.") + else if(istype(target, /obj/machinery/door/airlock)) + var/obj/machinery/door/airlock/A = target + if(A.density) + try_open_airlock(A) + else if(isliving(target)) + var/mob/living/G = target + if(issilicon(G)) + G.attack_animal(src) + return + else if(G.reagents && (iscarbon(G))) + var/can_poison = 1 + if(istype(G, /mob/living/carbon/human/)) + var/mob/living/carbon/human/H = G + if(H.dna) + if(!(H.species.reagent_tag & PROCESS_ORG) || (H.species.flags & NO_POISON)) + can_poison = 0 + spider_specialattack(G,can_poison) + else + G.attack_animal(src) + else + target.attack_animal(src) + +/mob/living/simple_animal/hostile/poison/terror_spider/proc/spider_specialattack(var/mob/living/carbon/human/L, var/poisonable) + L.attack_animal(src) + + + + + + +// -------------------------------------------------------------------------------- +// --------------------- TERROR SPIDERS: PROC OVERRIDES --------------------------- +// -------------------------------------------------------------------------------- + + +/mob/living/simple_animal/hostile/poison/terror_spider/examine(mob/user) + ..() + var/msg = "" + if(stat == DEAD) + msg += "It appears to be dead.\n" + else + if(key) + msg += "
Its eyes regard you with a curious intelligence." + if(health > (maxHealth*0.95)) + msg += "
It is in excellent health." + else if(health > (maxHealth*0.75)) + msg += "
It has a few injuries." + else if(health > (maxHealth*0.55)) + msg += "
It has many injuries." + else if(health > (maxHealth*0.25)) + msg += "
It is barely clinging on to life!" + else if(health < maxHealth && regen_points > regen_points_per_kill) + msg += "
It appears to be regenerating quickly" + if(killcount == 1) + msg += "
It is soaked in the blood of its prey." + if(killcount > 1) + msg += "
It is soaked with the blood of " + num2text(killcount) + " prey it has killed." + to_chat(usr,msg) + + +/mob/living/simple_animal/hostile/poison/terror_spider/New() + ..() + ts_spiderlist += src + if(type == /mob/living/simple_animal/hostile/poison/terror_spider) + message_admins("[src] spawned in [get_area(src)] - a subtype should have been spawned instead.") + qdel(src) + else + add_language("TerrorSpider") + add_language("Galactic Common") + default_language = all_languages["TerrorSpider"] + + name += " ([rand(1, 1000)])" + msg_terrorspiders("[src] has grown in [get_area(src)].") + if(name_usealtnames) + name = pick(altnames) + if(is_away_level(z)) + spider_awaymission = 1 + ts_count_alive_awaymission++ + else + ts_count_alive_station++ + // after 30 seconds, assuming nobody took control of it yet, offer it to ghosts. + spawn(150) // deciseconds! + CheckFaction() + spawn(300) // deciseconds! + if(spider_awaymission) + return + else if(ckey) + notify_ghosts("[src] has appeared in [get_area(src)]. (already player-controlled)") + else if(ai_playercontrol_allowingeneral && ai_playercontrol_allowtype) + notify_ghosts("[src] has appeared in [get_area(src)].", enter_link = "(Click to control)", source = src) + +/mob/living/simple_animal/hostile/poison/terror_spider/Destroy() + ts_spiderlist -= src + ..() + +/mob/living/simple_animal/hostile/poison/terror_spider/Life() + if(stat != DEAD) + if(regen_points < regen_points_max) + regen_points += regen_points_per_tick + if((bruteloss > 0) || (fireloss > 0)) + if(regen_points > regen_points_per_hp) + if(bruteloss > 0) + adjustBruteLoss(-1) + regen_points -= regen_points_per_hp + else if(fireloss > 0) + adjustFireLoss(-1) + regen_points -= regen_points_per_hp + if(prob(5)) + CheckFaction() + else if(stat == DEAD) + if(prob(2)) + // 2% chance every cycle to decompose + visible_message("\The dead body of the [src] decomposes!") + gib() + ..() + + +/mob/living/simple_animal/hostile/poison/terror_spider/death(gibbed) + if(!gibbed) + msg_terrorspiders("[src] has died in [get_area(src)].") + if(!hasdroppedloot) + hasdroppedloot = 1 + ts_count_dead++ + ts_death_last = world.time + if(spider_awaymission) + ts_count_alive_awaymission-- + else + ts_count_alive_station-- + ..() + + +/mob/living/simple_animal/hostile/poison/terror_spider/proc/spider_special_action() + // Do nothing, this proc only exists to be overriden + +/mob/living/simple_animal/hostile/poison/terror_spider/Bump(atom/A) + if(istype(A, /obj/machinery/door/airlock)) + var/obj/machinery/door/airlock/L = A + if(L.density) + try_open_airlock(L) + if(istype(A, /obj/machinery/door/firedoor)) + var/obj/machinery/door/firedoor/F = A + if(F.density && !F.blocked) + F.open() + ..() + +/mob/living/simple_animal/hostile/poison/terror_spider/proc/msg_terrorspiders(var/msgtext) + for(var/mob/living/simple_animal/hostile/poison/terror_spider/T in ts_spiderlist) + if(T.stat != DEAD) + to_chat(T, "TerrorSense: " + msgtext + "") + +/mob/living/simple_animal/hostile/poison/terror_spider/proc/CheckFaction() + if(faction.len != 1 || (!("terrorspiders" in faction)) || master_commander != null) + visible_message("[src] writhes in pain!") + death() + +/mob/living/simple_animal/hostile/poison/terror_spider/proc/try_open_airlock(var/obj/machinery/door/airlock/D) + if(!D.density) + to_chat(src, "Closing doors does not help us.") + else if(D.welded) + to_chat(src, "The door is welded shut.") + else if(D.locked) + to_chat(src, "The door is bolted shut.") + else if(D.operating) + else if( (!istype(D.req_access) || !D.req_access.len) && (!istype(D.req_one_access) || !D.req_one_access.len) && (D.req_access_txt == "0") && (D.req_one_access_txt == "0") ) + //visible_message("\the [src] opens the public-access door [D]!") + D.open(1) + else if(D.arePowerSystemsOn() && (spider_opens_doors != 2)) + to_chat(src, "The door's motors resist your efforts to force it.") + else if(!spider_opens_doors) + to_chat(src, "Your type of spider is not strong enough to force open doors.") + else + visible_message("\the [src] pries open the door!") + playsound(src.loc, "sparks", 100, 1) + D.open(1) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm new file mode 100644 index 00000000000..27bcbdc27c8 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm @@ -0,0 +1,160 @@ + +/mob/living/simple_animal/hostile/poison/terror_spider/verb/ShowGuide() + set name = "Show Guide" + set category = "Spider" + set desc = "Learn how to spider." + to_chat(src, "------------------------") + to_chat(src, "Intro:") + to_chat(src, "- Terror Spiders are a bioweapon, created when the Syndicate mixed Giant Spider and Xenomorph DNA.") + to_chat(src, "- Ruled by Queens, they are aggressive, and very good in melee combat.") + to_chat(src, " ") + to_chat(src, "Communications:") + to_chat(src, "- You speak over the Terror Spider hivemind by default. All other TS hear this. To speak common, use :9 or .9 ") + to_chat(src, "- Terror Spiders are the nuke ops of spiders. They work as a team. Communicate regularly!") + to_chat(src, " ") + to_chat(src, "Verbs:") + to_chat(src, " - Show Guide - Shows this guide.") + to_chat(src, " - Web - Spins a terror web. Non-spiders get trapped if they touch a web.") + to_chat(src, " - Eat Corpse - Eat the corpse of a dead foe to boost your regeneration") + to_chat(src, "------------------------") + to_chat(src, " ") + + +// ---------- WEB + +/mob/living/simple_animal/hostile/poison/terror_spider/verb/Web() + set name = "Lay Web" + set category = "Spider" + set desc = "Spin a sticky web to slow down prey." + var/T = loc + if(busy != SPINNING_WEB) + busy = SPINNING_WEB + visible_message("\the [src] begins to secrete a sticky substance.") + stop_automated_movement = 1 + spawn(40) + if(busy == SPINNING_WEB && loc == T) + new /obj/effect/spider/terrorweb(T) + busy = 0 + stop_automated_movement = 0 + + +/obj/effect/spider/terrorweb + name = "terror web" + desc = "it's stringy and sticky" + icon = 'icons/effects/effects.dmi' + anchored = 1 // prevents people dragging it + density = 0 // prevents it blocking all movement + health = 20 // two welders, or one laser shot (15 for the normal spider webs) + icon_state = "stickyweb1" + + +/obj/effect/spider/terrorweb/New() + if(prob(50)) + icon_state = "stickyweb2" + + +/obj/effect/spider/terrorweb/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + if(air_group || (height==0)) return 1 + if(istype(mover, /mob/living/simple_animal/hostile/poison/terror_spider)) + return 1 + if(istype(mover, /mob/living)) + if(prob(80)) + to_chat(mover, "You get stuck in \the [src] for a moment.") + var/mob/living/M = mover + M.Stun(5) // 5 seconds. + M.Weaken(5) // 5 seconds. + return 1 + else + return 0 + if(istype(mover, /obj/item/projectile)) + return prob(20) + return ..() + + + +// ---------- WRAP + +/mob/living/simple_animal/hostile/poison/terror_spider/proc/DoWrap() + if(!cocoon_target) + var/list/choices = list() + for(var/mob/living/L in view(1,src)) + if(L == src) + continue + if(Adjacent(L)) + if(L.stat != CONSCIOUS) + choices += L + for(var/obj/O in loc) + if(Adjacent(O)) + if(istype(O, /obj/effect/spider/terrorweb)) + else + choices += O + cocoon_target = input(src,"What do you wish to cocoon?") in null|choices + if(cocoon_target && busy != SPINNING_COCOON) + busy = SPINNING_COCOON + visible_message("\the [src] begins to secrete a sticky substance around \the [cocoon_target].") + stop_automated_movement = 1 + walk(src,0) + spawn(20) + if(busy == SPINNING_COCOON) + if(cocoon_target && istype(cocoon_target.loc, /turf) && get_dist(src,cocoon_target) <= 1) + var/obj/effect/spider/cocoon/C = new(cocoon_target.loc) + var/large_cocoon = 0 + C.pixel_x = cocoon_target.pixel_x + C.pixel_y = cocoon_target.pixel_y + for(var/obj/item/I in C.loc) + I.loc = C + for(var/obj/structure/S in C.loc) + if(!S.anchored) + S.loc = C + large_cocoon = 1 + for(var/obj/machinery/M in C.loc) + if(!M.anchored) + M.loc = C + large_cocoon = 1 + for(var/mob/living/L in C.loc) + if(istype(L, /mob/living/simple_animal/hostile/poison/terror_spider)) + continue + large_cocoon = 1 + fed++ + last_cocoon_object = 0 + L.loc = C + C.pixel_x = L.pixel_x + C.pixel_y = L.pixel_y + visible_message("\the [src] sticks a proboscis into \the [L] and sucks a viscous substance out.") + break + if(large_cocoon) + C.icon_state = pick("cocoon_large1","cocoon_large2","cocoon_large3") + cocoon_target = null + busy = 0 + stop_automated_movement = 0 + + + +/mob/living/simple_animal/hostile/poison/terror_spider/verb/EatCorpse() + set name = "Eat Corpse" + set category = "Spider" + set desc = "Takes a bite out of a humanoid. Increases regeneration. Use on dead bodies is preferable!" + var/choices = list() + for(var/mob/living/L in view(1,src)) + if(L == src) + continue + if(L in nibbled) + continue + if(Adjacent(L)) + if(L.stat != CONSCIOUS) + choices += L + var/nibbletarget = input(src,"What do you wish to nibble?") in null|choices + if(!nibbletarget) + // cancel + else if(!isliving(nibbletarget)) + to_chat(src, "[nibbletarget] is not edible.") + else if(nibbletarget in nibbled) + to_chat(src, "You have already eaten some of [nibbletarget]. Their blood is no use to you now.") + else + nibbled += nibbletarget + regen_points += regen_points_per_kill + to_chat(src, "You take a bite out of [nibbletarget], boosting your regeneration for awhile.") + src.do_attack_animation(nibbletarget) + if(spider_debug) + to_chat(src, "You now have " + num2text(regen_points) + " regeneration points.") + diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css index e299fa5a5c5..788db78dafc 100644 --- a/goon/browserassets/css/browserOutput.css +++ b/goon/browserassets/css/browserOutput.css @@ -291,6 +291,8 @@ h1.alert, h2.alert {color: #000000;} .alien {color: #543354;} .noticealien {color: #00c000;} .alertalien {color: #00c000; font-weight: bold;} +.terrorspider {color: #543354;} + .sinister {color: #800080; font-weight: bold; font-style: italic;} /* /vg/ */ .blob {color: #006221; font-weight: bold; font-style: italic;} diff --git a/icons/mob/terrorspider.dmi b/icons/mob/terrorspider.dmi new file mode 100644 index 0000000000000000000000000000000000000000..fa61f1c997931ae033a8bb1ba423cd409d16033e GIT binary patch literal 35431 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 literal 0 HcmV?d00001 diff --git a/paradise.dme b/paradise.dme index 9e0e34dabc1..635775cab0e 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1659,6 +1659,15 @@ #include "code\modules\mob\living\simple_animal\hostile\retaliate\pet.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\undead.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\__defines.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\black.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\chem.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\ghost.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\gray.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\prince.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\red.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\terror_spiders.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\verbs.dm" #include "code\modules\mob\new_player\login.dm" #include "code\modules\mob\new_player\logout.dm" #include "code\modules\mob\new_player\new_player.dm" From 42c300a9337ca3af3ff8f416a35606477d3ca017 Mon Sep 17 00:00:00 2001 From: Kyep Date: Sun, 28 Aug 2016 19:56:15 -0700 Subject: [PATCH 02/15] Crazylemon - Removes H.DNA check - Adds msgs.Join for formatting - Fixes issue with black spiders' attack logs showing up twice More Crazylemon Fixes - Switches things to Join() - Adds exception logging in cases where a base type is created, or a spider is created with the wrong faction settings - Deletes DoWrap, as it was for greens. More Crazylemon text fixes --- .../hostile/terror_spiders/black.dm | 11 +- .../hostile/terror_spiders/ghost.dm | 6 +- .../hostile/terror_spiders/gray.dm | 11 +- .../hostile/terror_spiders/prince.dm | 13 ++- .../hostile/terror_spiders/red.dm | 11 +- .../hostile/terror_spiders/terror_spiders.dm | 33 +++--- .../hostile/terror_spiders/verbs.dm | 110 ++++-------------- 7 files changed, 66 insertions(+), 129 deletions(-) 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 6e1dbbdf5a0..b0a76cc5a19 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 @@ -30,17 +30,16 @@ /mob/living/simple_animal/hostile/poison/terror_spider/black/ShowGuide() ..() - var/guidetext = "BLACK TERROR guide:" - guidetext += "
- You are an assassin. Even 2-3 bites from you is fatal to organic humanoids - if you back off and let your poison work. You are very vulnurable to mechs and borgs." - guidetext += "
- Try to bite a few times and retreat quickly. You will die if you stick around. You are very dangerous and should expect crew to focus fire on you." - to_chat(src, guidetext) + var/list/guidelist = list() + guidelist += "BLACK TERROR guide:" + guidelist += "- You are an assassin. Even 2-3 bites from you is fatal to organic humanoids - if you back off and let your poison work. You are very vulnurable to mechs and borgs." + guidelist += "- Try to bite a few times and retreat quickly. You will die if you stick around. You are very dangerous and should expect crew to focus fire on you." + to_chat(src, guidelist.Join("
")) /mob/living/simple_animal/hostile/poison/terror_spider/black/spider_specialattack(var/mob/living/carbon/human/L, var/poisonable) if(!poisonable) - ..() return ..() if(L.reagents.has_reagent("terror_black_toxin", 50)) - L.attack_animal(src) return ..() var/inject_target = pick("chest", "head") if(L.stunned || L.can_inject(null, 0, inject_target, 0)) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm index 90b485cfb6a..ab2c93aac45 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm @@ -12,8 +12,8 @@ if(key)//Someone is in it return var/error_on_humanize = "" - var/humanize_prompt = "Take direct control of " + src.name + "? " - humanize_prompt += "Role: " + spider_role_summary + var/humanize_prompt = "Take direct control of [src]?" + humanize_prompt += "Role: [spider_role_summary]" if(user.ckey in ts_ckey_blacklist) error_on_humanize = "You are not able to control any terror spider this round." else if(!ai_playercontrol_allowingeneral) @@ -32,7 +32,7 @@ if(spider_ask == "No" || !src || qdeleted(src)) return else - to_chat(user, "Cannot inhabit spider: " + error_on_humanize) + to_chat(user, "Cannot inhabit spider: [error_on_humanize]") return if(key) to_chat(user, "Someone else already took this spider.") 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 5eae1f60bc5..0bacb9667f1 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 @@ -26,11 +26,12 @@ /mob/living/simple_animal/hostile/poison/terror_spider/gray/ShowGuide() ..() - var/guidetext = "GRAY TERROR guide:" - guidetext += "
- You are a stealth killer. Your venom silences its targets." - guidetext += "
- You are weak, but fast, and should use webs in corridors to trap your prey, hiding in a vent until they are entangled." - guidetext += "
- Do not attempt to take on well-armed foes without the element of surprise - you will die quickly!" - to_chat(src, guidetext) + var/list/guidelist = list() + guidelist += "GRAY TERROR guide:" + guidelist += "- You are a stealth killer. Your venom silences its targets." + guidelist += "- You are weak, but fast, and should use webs in corridors to trap your prey, hiding in a vent until they are entangled." + guidelist += "- Do not attempt to take on well-armed foes without the element of surprise - you will die quickly!" + to_chat(src, guidelist.Join("
")) /mob/living/simple_animal/hostile/poison/terror_spider/gray/spider_specialattack(var/mob/living/carbon/human/L, var/poisonable) if(!poisonable) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm index ef8919dc3a6..81e4cbba0f3 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm @@ -31,12 +31,13 @@ /mob/living/simple_animal/hostile/poison/terror_spider/prince/ShowGuide() ..() - var/guidetext = "PRINCE OF TERROR guide:" - guidetext += "
- A ferocious warrior, you wander the stars, identifying potential nest sites, and threats, for your fellow Terror Spiders." - guidetext += "
- You have been sent to this remote station to determine if it would make a suitable nest." - guidetext += "
- You have lots of health, and decent attacks, but can be killed by a well-armed group." - guidetext += "
- Expect crew to treat you as a level 5 biohazard. Even a single Prince (aka: War Spider) can wreck a station." - to_chat(src, guidetext) + var/list/guidelist = list() + guidelist += "PRINCE OF TERROR guide:" + guidelist += "- A ferocious warrior, you wander the stars, identifying potential nest sites, and threats, for your fellow Terror Spiders." + guidelist += "- You have been sent to this remote station to determine if it would make a suitable nest." + guidelist += "- You have lots of health, and decent attacks, but can be killed by a well-armed group." + guidelist += "- Expect crew to treat you as a level 5 biohazard. Even a single Prince (aka: War Spider) can wreck a station." + to_chat(src, guidelist.Join("
")) /mob/living/simple_animal/hostile/poison/terror_spider/prince/spider_specialattack(var/mob/living/carbon/human/L) if(prob(15)) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm index 96338fd925d..377d500ca1b 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm @@ -63,8 +63,9 @@ /mob/living/simple_animal/hostile/poison/terror_spider/red/ShowGuide() ..() - var/guidetext = "
RED TERROR guide:" - guidetext += "
- A straightforward fighter, you have high health, and high melee damage, but are very slow-moving." - guidetext += "
- You are best at taking out slow, armored foes. Be careful not to get kited with ranged weapons." - guidetext += "
- You can take a lot of hits, so don't be afraid to act as the tank in a group." - to_chat(src, guidetext) \ No newline at end of file + var/list/guidelist = list() + guidelist += "RED TERROR guide:" + guidelist += "- A straightforward fighter, you have high health, and high melee damage, but are very slow-moving." + guidelist += "- You are best at taking out slow, armored foes. Be careful not to get kited with ranged weapons." + guidelist += "- You can take a lot of hits, so don't be afraid to act as the tank in a group." + to_chat(src, guidelist.Join("
")) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm index 1b70a7fc2c5..4f965770ad0 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -165,9 +165,8 @@ var/global/list/ts_spiderlist = list() var/can_poison = 1 if(istype(G, /mob/living/carbon/human/)) var/mob/living/carbon/human/H = G - if(H.dna) - if(!(H.species.reagent_tag & PROCESS_ORG) || (H.species.flags & NO_POISON)) - can_poison = 0 + if(!(H.species.reagent_tag & PROCESS_ORG) || (H.species.flags & NO_POISON)) + can_poison = 0 spider_specialattack(G,can_poison) else G.attack_animal(src) @@ -189,27 +188,27 @@ var/global/list/ts_spiderlist = list() /mob/living/simple_animal/hostile/poison/terror_spider/examine(mob/user) ..() - var/msg = "" + var/list/msgs = list() if(stat == DEAD) - msg += "It appears to be dead.\n" + msgs += "It appears to be dead.\n" else if(key) - msg += "
Its eyes regard you with a curious intelligence." + msgs += "Its eyes regard you with a curious intelligence." if(health > (maxHealth*0.95)) - msg += "
It is in excellent health." + msgs += "It is in excellent health." else if(health > (maxHealth*0.75)) - msg += "
It has a few injuries." + msgs += "It has a few injuries." else if(health > (maxHealth*0.55)) - msg += "
It has many injuries." + msgs += "It has many injuries." else if(health > (maxHealth*0.25)) - msg += "
It is barely clinging on to life!" + msgs += "It is barely clinging on to life!" else if(health < maxHealth && regen_points > regen_points_per_kill) - msg += "
It appears to be regenerating quickly" + msgs += "It appears to be regenerating quickly" if(killcount == 1) - msg += "
It is soaked in the blood of its prey." + msgs += "It is soaked in the blood of its prey." if(killcount > 1) - msg += "
It is soaked with the blood of " + num2text(killcount) + " prey it has killed." - to_chat(usr,msg) + msgs += "It is soaked with the blood of [killcount] prey it has killed." + to_chat(usr,msgs.Join("
")) /mob/living/simple_animal/hostile/poison/terror_spider/New() @@ -217,6 +216,7 @@ var/global/list/ts_spiderlist = list() ts_spiderlist += src if(type == /mob/living/simple_animal/hostile/poison/terror_spider) message_admins("[src] spawned in [get_area(src)] - a subtype should have been spawned instead.") + log_runtime(EXCEPTION("Base type of the terror spiders created at [atom_loc_line(src)]")) qdel(src) else add_language("TerrorSpider") @@ -245,7 +245,7 @@ var/global/list/ts_spiderlist = list() /mob/living/simple_animal/hostile/poison/terror_spider/Destroy() ts_spiderlist -= src - ..() + . = ..() /mob/living/simple_animal/hostile/poison/terror_spider/Life() if(stat != DEAD) @@ -300,11 +300,12 @@ var/global/list/ts_spiderlist = list() /mob/living/simple_animal/hostile/poison/terror_spider/proc/msg_terrorspiders(var/msgtext) for(var/mob/living/simple_animal/hostile/poison/terror_spider/T in ts_spiderlist) if(T.stat != DEAD) - to_chat(T, "TerrorSense: " + msgtext + "") + to_chat(T, "TerrorSense: [msgtext]") /mob/living/simple_animal/hostile/poison/terror_spider/proc/CheckFaction() if(faction.len != 1 || (!("terrorspiders" in faction)) || master_commander != null) visible_message("[src] writhes in pain!") + log_runtime(EXCEPTION("Terror spider created with incorrect faction list at: [atom_loc_line(src)]")) death() /mob/living/simple_animal/hostile/poison/terror_spider/proc/try_open_airlock(var/obj/machinery/door/airlock/D) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm index 27bcbdc27c8..aac1572712b 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm @@ -3,22 +3,23 @@ set name = "Show Guide" set category = "Spider" set desc = "Learn how to spider." - to_chat(src, "------------------------") - to_chat(src, "Intro:") - to_chat(src, "- Terror Spiders are a bioweapon, created when the Syndicate mixed Giant Spider and Xenomorph DNA.") - to_chat(src, "- Ruled by Queens, they are aggressive, and very good in melee combat.") - to_chat(src, " ") - to_chat(src, "Communications:") - to_chat(src, "- You speak over the Terror Spider hivemind by default. All other TS hear this. To speak common, use :9 or .9 ") - to_chat(src, "- Terror Spiders are the nuke ops of spiders. They work as a team. Communicate regularly!") - to_chat(src, " ") - to_chat(src, "Verbs:") - to_chat(src, " - Show Guide - Shows this guide.") - to_chat(src, " - Web - Spins a terror web. Non-spiders get trapped if they touch a web.") - to_chat(src, " - Eat Corpse - Eat the corpse of a dead foe to boost your regeneration") - to_chat(src, "------------------------") - to_chat(src, " ") - + var/list/guidelist = list() + guidelist += "------------------------" + guidelist += "Intro:" + guidelist += "- Terror Spiders are a bioweapon, created when the Syndicate mixed Giant Spider and Xenomorph DNA." + guidelist += "- Ruled by Queens, they are aggressive, and very good in melee combat." + guidelist += " " + guidelist += "Communications:" + guidelist += "- You speak over the Terror Spider hivemind by default. All other TS hear this. To speak common, use :9 or .9 " + guidelist += "- Terror Spiders are the nuke ops of spiders. They work as a team. Communicate regularly!" + guidelist += " " + guidelist += "Verbs:" + guidelist += " - Show Guide - Shows this guide." + guidelist += " - Web - Spins a terror web. Non-spiders get trapped if they touch a web." + guidelist += " - Eat Corpse - Eat the corpse of a dead foe to boost your regeneration" + guidelist += "------------------------" + guidelist += " " + to_chat(src, guidelist.Join("
")) // ---------- WEB @@ -26,17 +27,9 @@ set name = "Lay Web" set category = "Spider" set desc = "Spin a sticky web to slow down prey." - var/T = loc - if(busy != SPINNING_WEB) - busy = SPINNING_WEB - visible_message("\the [src] begins to secrete a sticky substance.") - stop_automated_movement = 1 - spawn(40) - if(busy == SPINNING_WEB && loc == T) - new /obj/effect/spider/terrorweb(T) - busy = 0 - stop_automated_movement = 0 - + visible_message("\the [src] begins to secrete a sticky substance.") + if(do_after(src, 40, target = loc)) + new /obj/effect/spider/terrorweb(loc) /obj/effect/spider/terrorweb name = "terror web" @@ -74,70 +67,13 @@ // ---------- WRAP -/mob/living/simple_animal/hostile/poison/terror_spider/proc/DoWrap() - if(!cocoon_target) - var/list/choices = list() - for(var/mob/living/L in view(1,src)) - if(L == src) - continue - if(Adjacent(L)) - if(L.stat != CONSCIOUS) - choices += L - for(var/obj/O in loc) - if(Adjacent(O)) - if(istype(O, /obj/effect/spider/terrorweb)) - else - choices += O - cocoon_target = input(src,"What do you wish to cocoon?") in null|choices - if(cocoon_target && busy != SPINNING_COCOON) - busy = SPINNING_COCOON - visible_message("\the [src] begins to secrete a sticky substance around \the [cocoon_target].") - stop_automated_movement = 1 - walk(src,0) - spawn(20) - if(busy == SPINNING_COCOON) - if(cocoon_target && istype(cocoon_target.loc, /turf) && get_dist(src,cocoon_target) <= 1) - var/obj/effect/spider/cocoon/C = new(cocoon_target.loc) - var/large_cocoon = 0 - C.pixel_x = cocoon_target.pixel_x - C.pixel_y = cocoon_target.pixel_y - for(var/obj/item/I in C.loc) - I.loc = C - for(var/obj/structure/S in C.loc) - if(!S.anchored) - S.loc = C - large_cocoon = 1 - for(var/obj/machinery/M in C.loc) - if(!M.anchored) - M.loc = C - large_cocoon = 1 - for(var/mob/living/L in C.loc) - if(istype(L, /mob/living/simple_animal/hostile/poison/terror_spider)) - continue - large_cocoon = 1 - fed++ - last_cocoon_object = 0 - L.loc = C - C.pixel_x = L.pixel_x - C.pixel_y = L.pixel_y - visible_message("\the [src] sticks a proboscis into \the [L] and sucks a viscous substance out.") - break - if(large_cocoon) - C.icon_state = pick("cocoon_large1","cocoon_large2","cocoon_large3") - cocoon_target = null - busy = 0 - stop_automated_movement = 0 - - /mob/living/simple_animal/hostile/poison/terror_spider/verb/EatCorpse() set name = "Eat Corpse" set category = "Spider" set desc = "Takes a bite out of a humanoid. Increases regeneration. Use on dead bodies is preferable!" var/choices = list() - for(var/mob/living/L in view(1,src)) - if(L == src) - continue + for(var/mob/living/L in oview(1,src)) if(L in nibbled) continue if(Adjacent(L)) @@ -146,8 +82,6 @@ var/nibbletarget = input(src,"What do you wish to nibble?") in null|choices if(!nibbletarget) // cancel - else if(!isliving(nibbletarget)) - to_chat(src, "[nibbletarget] is not edible.") else if(nibbletarget in nibbled) to_chat(src, "You have already eaten some of [nibbletarget]. Their blood is no use to you now.") else @@ -156,5 +90,5 @@ to_chat(src, "You take a bite out of [nibbletarget], boosting your regeneration for awhile.") src.do_attack_animation(nibbletarget) if(spider_debug) - to_chat(src, "You now have " + num2text(regen_points) + " regeneration points.") + to_chat(src, "You now have [regen_points] regeneration points.") From 7cf8be7f1cf018be69943b87d39b80042eac3993 Mon Sep 17 00:00:00 2001 From: Kyep Date: Mon, 29 Aug 2016 00:29:07 -0700 Subject: [PATCH 03/15] Replaces EatCorpse with Wrap --- .../hostile/terror_spiders/__defines.dm | 5 -- .../hostile/terror_spiders/gray.dm | 2 +- .../hostile/terror_spiders/terror_spiders.dm | 1 - .../hostile/terror_spiders/verbs.dm | 86 ++++++++++++++----- 4 files changed, 64 insertions(+), 30 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/__defines.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/__defines.dm index d86332ab32d..fafd30a4ae4 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/__defines.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/__defines.dm @@ -4,11 +4,6 @@ #define MOVING_TO_TARGET 3 #define SPINNING_COCOON 4 - -#define TS_DESC_RED "Red - Assault" -#define TS_DESC_BLACK "Black - Poison" -#define TS_DESC_PURPLE "Purple - Guard" - #define TS_TIER_1 1 #define TS_TIER_2 2 #define TS_TIER_3 3 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 0bacb9667f1..fa76d7c1033 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 @@ -3,7 +3,7 @@ // ----------------- TERROR SPIDERS: T1 GRAY TERROR ------------------------------- // -------------------------------------------------------------------------------- // -------------: ROLE: fast, weak terror spider -// -------------: SPECIAL: none +// -------------: SPECIAL: silences targets // -------------: TO FIGHT IT: shoot it! // -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386 diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm index 4f965770ad0..1205139cd87 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -93,7 +93,6 @@ var/global/list/ts_spiderlist = list() var/obj/machinery/atmospherics/unary/vent_pump/nest_vent // home vent, usually used by queens var/fed = 0 var/travelling_in_vent = 0 - var/list/nibbled = list() var/busy = 0 // leave this alone! var/spider_tier = TS_TIER_1 // 1 for red,gray,green. 2 for purple,black,white, 3 for prince, mother. 4 for queen, 5 for empress. var/attackstep = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm index aac1572712b..dc2633a5ac1 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm @@ -16,7 +16,7 @@ guidelist += "Verbs:" guidelist += " - Show Guide - Shows this guide." guidelist += " - Web - Spins a terror web. Non-spiders get trapped if they touch a web." - guidelist += " - Eat Corpse - Eat the corpse of a dead foe to boost your regeneration" + guidelist += " - Wrap - Wraps a nearby corpse or other object. Webbing a human boosts your health regeneration." guidelist += "------------------------" guidelist += " " to_chat(src, guidelist.Join("
")) @@ -65,30 +65,70 @@ + // ---------- WRAP -/mob/living/simple_animal/hostile/poison/terror_spider/verb/EatCorpse() - set name = "Eat Corpse" +/mob/living/simple_animal/hostile/poison/terror_spider/verb/Wrap() + set name = "Wrap" set category = "Spider" - set desc = "Takes a bite out of a humanoid. Increases regeneration. Use on dead bodies is preferable!" - var/choices = list() - for(var/mob/living/L in oview(1,src)) - if(L in nibbled) - continue - if(Adjacent(L)) - if(L.stat != CONSCIOUS) - choices += L - var/nibbletarget = input(src,"What do you wish to nibble?") in null|choices - if(!nibbletarget) - // cancel - else if(nibbletarget in nibbled) - to_chat(src, "You have already eaten some of [nibbletarget]. Their blood is no use to you now.") - else - nibbled += nibbletarget - regen_points += regen_points_per_kill - to_chat(src, "You take a bite out of [nibbletarget], boosting your regeneration for awhile.") - src.do_attack_animation(nibbletarget) - if(spider_debug) - to_chat(src, "You now have [regen_points] regeneration points.") + set desc = "Wrap up corpses (and possibly other ajacent objects)" + DoWrap() + +/mob/living/simple_animal/hostile/poison/terror_spider/proc/DoWrap() + if(!cocoon_target) + var/list/choices = list() + for(var/mob/living/L in oview(1,src)) + if(Adjacent(L)) + if(L.stat == DEAD) + choices += L + for(var/obj/O in loc) + if(Adjacent(O) && !O.anchored) + if(!istype(O, /obj/effect/spider/terrorweb) && !istype(O, /obj/effect/spider/cocoon)) + choices += O + if(ckey) + if(choices.len) + cocoon_target = input(src,"What do you wish to cocoon?") in null|choices + else + to_chat(src, "There is nothing nearby you can wrap.") + if(cocoon_target && busy != SPINNING_COCOON) + busy = SPINNING_COCOON + visible_message("\the [src] begins to secrete a sticky substance around \the [cocoon_target].") + stop_automated_movement = 1 + walk(src,0) + if(do_after(src, 40, target = cocoon_target.loc)) + if(busy == SPINNING_COCOON) + if(cocoon_target && istype(cocoon_target.loc, /turf) && get_dist(src,cocoon_target) <= 1) + var/obj/effect/spider/cocoon/C = new(cocoon_target.loc) + var/large_cocoon = 0 + C.pixel_x = cocoon_target.pixel_x + C.pixel_y = cocoon_target.pixel_y + for(var/obj/item/I in C.loc) + I.loc = C + for(var/obj/structure/S in C.loc) + if(!S.anchored) + S.loc = C + large_cocoon = 1 + for(var/obj/machinery/M in C.loc) + if(!M.anchored) + M.loc = C + large_cocoon = 1 + for(var/mob/living/L in C.loc) + if(istype(L, /mob/living/simple_animal/hostile/poison/terror_spider)) + continue + if(iscarbon(L)) + regen_points += regen_points_per_kill + fed++ + large_cocoon = 1 + last_cocoon_object = 0 + L.loc = C + C.pixel_x = L.pixel_x + C.pixel_y = L.pixel_y + visible_message("\the [src] sticks a proboscis into \the [L] and sucks a viscous substance out.") + break + if(large_cocoon) + C.icon_state = pick("cocoon_large1","cocoon_large2","cocoon_large3") + cocoon_target = null + busy = 0 + stop_automated_movement = 0 From 2c92b81011ad436baae50852d9686372bbcd7ee2 Mon Sep 17 00:00:00 2001 From: Kyep Date: Mon, 29 Aug 2016 23:05:46 -0700 Subject: [PATCH 04/15] Fox requests - Removes altnames - (var/mob -> (mob... - removes my_atom from chem - removes loot = list() - removes sentience_type = SENTIENCE_OTHER - more Fox-requested changes --- .../hostile/terror_spiders/black.dm | 3 +- .../hostile/terror_spiders/chem.dm | 2 - .../hostile/terror_spiders/gray.dm | 1 - .../hostile/terror_spiders/prince.dm | 1 - .../hostile/terror_spiders/red.dm | 1 - .../hostile/terror_spiders/terror_spiders.dm | 69 ++++++++----------- .../hostile/terror_spiders/verbs.dm | 2 + 7 files changed, 30 insertions(+), 49 deletions(-) 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 b0a76cc5a19..f6b117d2fed 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 @@ -12,7 +12,6 @@ /mob/living/simple_animal/hostile/poison/terror_spider/black name = "Black Terror spider" desc = "An ominous-looking spider, black as the darkest night, and with merciless yellow eyes." - altnames = list("Black Devil spider", "Giant Black Widow spider", "Shadow Terror spider") spider_role_summary = "Hit-and-run attacker with extremely venomous bite." icon_state = "terror_black" @@ -36,7 +35,7 @@ guidelist += "- Try to bite a few times and retreat quickly. You will die if you stick around. You are very dangerous and should expect crew to focus fire on you." to_chat(src, guidelist.Join("
")) -/mob/living/simple_animal/hostile/poison/terror_spider/black/spider_specialattack(var/mob/living/carbon/human/L, var/poisonable) +/mob/living/simple_animal/hostile/poison/terror_spider/black/spider_specialattack(mob/living/carbon/human/L, var/poisonable) if(!poisonable) return ..() if(L.reagents.has_reagent("terror_black_toxin", 50)) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm index 4dadffd17bf..10322e4c555 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm @@ -16,8 +16,6 @@ metabolization_rate = 0.1 /datum/reagent/terror_black_toxin/on_mob_life(var/mob/living/M) - if(!M) - M = holder.my_atom if(volume < 15) // bitten once, die slowly. Easy to survive a single bite - just go to medbay. // total damage: 2/tick, human health 150 until crit, = 75 ticks, = 150 seconds = 2.5 minutes to get to medbay. 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 fa76d7c1033..ca30686c7f5 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 @@ -10,7 +10,6 @@ /mob/living/simple_animal/hostile/poison/terror_spider/gray name = "Gray Terror spider" desc = "An ominous-looking gray spider, it seems jittery." - altnames = list("Gray Trap spider", "Gray Stalker spider", "Ghostly Ambushing spider") spider_role_summary = "Fast-moving but weak spider." icon_state = "terror_gray" icon_living = "terror_gray" diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm index 81e4cbba0f3..99b48e20987 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm @@ -14,7 +14,6 @@ name = "Prince of Terror spider" desc = "An enormous, terrifying spider. It looks like it is judging everything it sees. Extremely dangerous." spider_role_summary = "Boss-level terror spider. Lightning bruiser. Capable of taking on a squad by itself." - altnames = list("Prince of Terror", "Terror Prince") icon_state = "terror_queen" icon_living = "terror_queen" icon_dead = "terror_queen_dead" diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm index 377d500ca1b..15fa8e22fac 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm @@ -13,7 +13,6 @@ /mob/living/simple_animal/hostile/poison/terror_spider/red name = "Red Terror spider" desc = "An ominous-looking red spider, it has eight beady red eyes, and nasty, big, pointy fangs!" - altnames = list("Red Terror spider", "Crimson Terror spider", "Bloody Butcher spider") spider_role_summary = "High health, high damage, very slow, melee juggernaut" diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm index 1205139cd87..8ec1777944d 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -15,8 +15,6 @@ var/global/list/ts_spiderlist = list() /mob/living/simple_animal/hostile/poison/terror_spider/ // Name / Description name = "terror spider" - var/altnames = list() - var/name_usealtnames = 0 // if 1, spiders use their randomized names, if not they're all " terror" desc = "The generic parent of all other terror spider types. If you see this in-game, it is a bug." // Icons @@ -49,15 +47,11 @@ var/global/list/ts_spiderlist = list() speak_emote = list("hisses") emote_hear = list("hisses") - // Loot - loot = list() - // Languages are handled in terror_spider/New() // Interaction keywords response_help = "pets" response_disarm = "gently pushes aside" - response_harm = "hits" // regeneration settings - overridable by child classes var/regen_points = 0 // number of regen points they have by default @@ -113,9 +107,6 @@ var/global/list/ts_spiderlist = list() maxbodytemp = 1500 heat_damage_per_tick = 5 //amount of damage applied if animal's body temperature is higher than maxbodytemp - // Xenobio Interactions - sentience_type = SENTIENCE_OTHER // prevents people from using a sentience potion on a TS to tame it - // DEBUG OPTIONS & COMMANDS var/spider_debug = 0 @@ -172,7 +163,7 @@ var/global/list/ts_spiderlist = list() else target.attack_animal(src) -/mob/living/simple_animal/hostile/poison/terror_spider/proc/spider_specialattack(var/mob/living/carbon/human/L, var/poisonable) +/mob/living/simple_animal/hostile/poison/terror_spider/proc/spider_specialattack(mob/living/carbon/human/L, var/poisonable) L.attack_animal(src) @@ -213,38 +204,31 @@ var/global/list/ts_spiderlist = list() /mob/living/simple_animal/hostile/poison/terror_spider/New() ..() ts_spiderlist += src - if(type == /mob/living/simple_animal/hostile/poison/terror_spider) - message_admins("[src] spawned in [get_area(src)] - a subtype should have been spawned instead.") - log_runtime(EXCEPTION("Base type of the terror spiders created at [atom_loc_line(src)]")) - qdel(src) - else - add_language("TerrorSpider") - add_language("Galactic Common") - default_language = all_languages["TerrorSpider"] + add_language("TerrorSpider") + add_language("Galactic Common") + default_language = all_languages["TerrorSpider"] - name += " ([rand(1, 1000)])" - msg_terrorspiders("[src] has grown in [get_area(src)].") - if(name_usealtnames) - name = pick(altnames) - if(is_away_level(z)) - spider_awaymission = 1 - ts_count_alive_awaymission++ - else - ts_count_alive_station++ - // after 30 seconds, assuming nobody took control of it yet, offer it to ghosts. - spawn(150) // deciseconds! - CheckFaction() - spawn(300) // deciseconds! - if(spider_awaymission) - return - else if(ckey) - notify_ghosts("[src] has appeared in [get_area(src)]. (already player-controlled)") - else if(ai_playercontrol_allowingeneral && ai_playercontrol_allowtype) - notify_ghosts("[src] has appeared in [get_area(src)].", enter_link = "
(Click to control)", source = src) + name += " ([rand(1, 1000)])" + msg_terrorspiders("[src] has grown in [get_area(src)].") + if(is_away_level(z)) + spider_awaymission = 1 + ts_count_alive_awaymission++ + else + ts_count_alive_station++ + // after 30 seconds, assuming nobody took control of it yet, offer it to ghosts. + spawn(150) // deciseconds! + CheckFaction() + spawn(300) // deciseconds! + if(spider_awaymission) + return + else if(ckey) + notify_ghosts("[src] has appeared in [get_area(src)]. (already player-controlled)") + else if(ai_playercontrol_allowingeneral && ai_playercontrol_allowtype) + notify_ghosts("[src] has appeared in [get_area(src)].", enter_link = "(Click to control)", source = src) /mob/living/simple_animal/hostile/poison/terror_spider/Destroy() ts_spiderlist -= src - . = ..() + return ..() /mob/living/simple_animal/hostile/poison/terror_spider/Life() if(stat != DEAD) @@ -283,7 +267,7 @@ var/global/list/ts_spiderlist = list() /mob/living/simple_animal/hostile/poison/terror_spider/proc/spider_special_action() - // Do nothing, this proc only exists to be overriden + return /mob/living/simple_animal/hostile/poison/terror_spider/Bump(atom/A) if(istype(A, /obj/machinery/door/airlock)) @@ -296,7 +280,7 @@ var/global/list/ts_spiderlist = list() F.open() ..() -/mob/living/simple_animal/hostile/poison/terror_spider/proc/msg_terrorspiders(var/msgtext) +/mob/living/simple_animal/hostile/poison/terror_spider/proc/msg_terrorspiders(msgtext) for(var/mob/living/simple_animal/hostile/poison/terror_spider/T in ts_spiderlist) if(T.stat != DEAD) to_chat(T, "TerrorSense: [msgtext]") @@ -307,14 +291,15 @@ var/global/list/ts_spiderlist = list() log_runtime(EXCEPTION("Terror spider created with incorrect faction list at: [atom_loc_line(src)]")) death() -/mob/living/simple_animal/hostile/poison/terror_spider/proc/try_open_airlock(var/obj/machinery/door/airlock/D) +/mob/living/simple_animal/hostile/poison/terror_spider/proc/try_open_airlock(obj/machinery/door/airlock/D) + if(D.operating) + return if(!D.density) to_chat(src, "Closing doors does not help us.") else if(D.welded) to_chat(src, "The door is welded shut.") else if(D.locked) to_chat(src, "The door is bolted shut.") - else if(D.operating) else if( (!istype(D.req_access) || !D.req_access.len) && (!istype(D.req_one_access) || !D.req_one_access.len) && (D.req_access_txt == "0") && (D.req_one_access_txt == "0") ) //visible_message("\the [src] opens the public-access door [D]!") D.open(1) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm index dc2633a5ac1..4a61c09a3ec 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm @@ -116,6 +116,8 @@ for(var/mob/living/L in C.loc) if(istype(L, /mob/living/simple_animal/hostile/poison/terror_spider)) continue + if(L.stat != DEAD) + continue if(iscarbon(L)) regen_points += regen_points_per_kill fed++ From 3514953b41ea7d866bbc86d614670b852ec5d4c8 Mon Sep 17 00:00:00 2001 From: Kyep Date: Mon, 29 Aug 2016 23:33:40 -0700 Subject: [PATCH 05/15] Deletes ShowGuide() --- .../hostile/terror_spiders/black.dm | 11 +--------- .../hostile/terror_spiders/chem.dm | 2 +- .../hostile/terror_spiders/ghost.dm | 1 - .../hostile/terror_spiders/gray.dm | 10 +-------- .../hostile/terror_spiders/prince.dm | 10 --------- .../hostile/terror_spiders/red.dm | 9 -------- .../hostile/terror_spiders/verbs.dm | 22 ------------------- 7 files changed, 3 insertions(+), 62 deletions(-) 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 f6b117d2fed..8566cc1e476 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 @@ -26,16 +26,7 @@ spider_tier = TS_TIER_2 - -/mob/living/simple_animal/hostile/poison/terror_spider/black/ShowGuide() - ..() - var/list/guidelist = list() - guidelist += "BLACK TERROR guide:" - guidelist += "- You are an assassin. Even 2-3 bites from you is fatal to organic humanoids - if you back off and let your poison work. You are very vulnurable to mechs and borgs." - guidelist += "- Try to bite a few times and retreat quickly. You will die if you stick around. You are very dangerous and should expect crew to focus fire on you." - to_chat(src, guidelist.Join("
")) - -/mob/living/simple_animal/hostile/poison/terror_spider/black/spider_specialattack(mob/living/carbon/human/L, var/poisonable) +/mob/living/simple_animal/hostile/poison/terror_spider/black/spider_specialattack(mob/living/carbon/human/L, poisonable) if(!poisonable) return ..() if(L.reagents.has_reagent("terror_black_toxin", 50)) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm index 10322e4c555..01c11e9944f 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm @@ -15,7 +15,7 @@ color = "#CF3600" metabolization_rate = 0.1 -/datum/reagent/terror_black_toxin/on_mob_life(var/mob/living/M) +/datum/reagent/terror_black_toxin/on_mob_life(mob/living/M) if(volume < 15) // bitten once, die slowly. Easy to survive a single bite - just go to medbay. // total damage: 2/tick, human health 150 until crit, = 75 ticks, = 150 seconds = 2.5 minutes to get to medbay. diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm index ab2c93aac45..7d85354073f 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm @@ -40,5 +40,4 @@ key = user.key for(var/mob/dead/observer/G in player_list) G.show_message("A ghost has taken control of [src]. ([ghost_follow_link(src, ghost=G)]).") - ShowGuide() 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 ca30686c7f5..4da8c21e812 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 @@ -23,16 +23,8 @@ stat_attack = 1 // ensures they will target people in crit, too! environment_smash = 1 -/mob/living/simple_animal/hostile/poison/terror_spider/gray/ShowGuide() - ..() - var/list/guidelist = list() - guidelist += "GRAY TERROR guide:" - guidelist += "- You are a stealth killer. Your venom silences its targets." - guidelist += "- You are weak, but fast, and should use webs in corridors to trap your prey, hiding in a vent until they are entangled." - guidelist += "- Do not attempt to take on well-armed foes without the element of surprise - you will die quickly!" - to_chat(src, guidelist.Join("
")) -/mob/living/simple_animal/hostile/poison/terror_spider/gray/spider_specialattack(var/mob/living/carbon/human/L, var/poisonable) +/mob/living/simple_animal/hostile/poison/terror_spider/gray/spider_specialattack(mob/living/carbon/human/L, poisonable) if(!poisonable) ..() return diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm index 99b48e20987..1069ae13e05 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm @@ -28,16 +28,6 @@ spider_opens_doors = 2 -/mob/living/simple_animal/hostile/poison/terror_spider/prince/ShowGuide() - ..() - var/list/guidelist = list() - guidelist += "PRINCE OF TERROR guide:" - guidelist += "- A ferocious warrior, you wander the stars, identifying potential nest sites, and threats, for your fellow Terror Spiders." - guidelist += "- You have been sent to this remote station to determine if it would make a suitable nest." - guidelist += "- You have lots of health, and decent attacks, but can be killed by a well-armed group." - guidelist += "- Expect crew to treat you as a level 5 biohazard. Even a single Prince (aka: War Spider) can wreck a station." - to_chat(src, guidelist.Join("
")) - /mob/living/simple_animal/hostile/poison/terror_spider/prince/spider_specialattack(var/mob/living/carbon/human/L) if(prob(15)) visible_message("[src] rams into [L], knocking them to the floor!") diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm index 15fa8e22fac..2aae9980d13 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm @@ -59,12 +59,3 @@ melee_damage_lower = melee_damage_lower_rage0 melee_damage_upper = melee_damage_upper_rage0 ..() - -/mob/living/simple_animal/hostile/poison/terror_spider/red/ShowGuide() - ..() - var/list/guidelist = list() - guidelist += "RED TERROR guide:" - guidelist += "- A straightforward fighter, you have high health, and high melee damage, but are very slow-moving." - guidelist += "- You are best at taking out slow, armored foes. Be careful not to get kited with ranged weapons." - guidelist += "- You can take a lot of hits, so don't be afraid to act as the tank in a group." - to_chat(src, guidelist.Join("
")) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm index 4a61c09a3ec..1791aa9bc41 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm @@ -1,26 +1,4 @@ -/mob/living/simple_animal/hostile/poison/terror_spider/verb/ShowGuide() - set name = "Show Guide" - set category = "Spider" - set desc = "Learn how to spider." - var/list/guidelist = list() - guidelist += "------------------------" - guidelist += "Intro:" - guidelist += "- Terror Spiders are a bioweapon, created when the Syndicate mixed Giant Spider and Xenomorph DNA." - guidelist += "- Ruled by Queens, they are aggressive, and very good in melee combat." - guidelist += " " - guidelist += "Communications:" - guidelist += "- You speak over the Terror Spider hivemind by default. All other TS hear this. To speak common, use :9 or .9 " - guidelist += "- Terror Spiders are the nuke ops of spiders. They work as a team. Communicate regularly!" - guidelist += " " - guidelist += "Verbs:" - guidelist += " - Show Guide - Shows this guide." - guidelist += " - Web - Spins a terror web. Non-spiders get trapped if they touch a web." - guidelist += " - Wrap - Wraps a nearby corpse or other object. Webbing a human boosts your health regeneration." - guidelist += "------------------------" - guidelist += " " - to_chat(src, guidelist.Join("
")) - // ---------- WEB /mob/living/simple_animal/hostile/poison/terror_spider/verb/Web() From 87318d1993f1c093ae575992b31f019dc895870c Mon Sep 17 00:00:00 2001 From: Kyep Date: Tue, 30 Aug 2016 00:30:08 -0700 Subject: [PATCH 06/15] Replaces Web/Wrap verbs with action buttons --- .../hostile/terror_spiders/terror_spiders.dm | 8 +++++ .../hostile/terror_spiders/verbs.dm | 30 +++++++++++++------ 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm index 8ec1777944d..85fec613c91 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -110,6 +110,9 @@ var/global/list/ts_spiderlist = list() // DEBUG OPTIONS & COMMANDS var/spider_debug = 0 + var/datum/action/innate/terrorspider/web/web_action + var/datum/action/innate/terrorspider/wrap/wrap_action + // -------------------------------------------------------------------------------- // --------------------- TERROR SPIDERS: SHARED ATTACK CODE ----------------------- @@ -208,6 +211,11 @@ var/global/list/ts_spiderlist = list() add_language("Galactic Common") default_language = all_languages["TerrorSpider"] + web_action = new() + web_action.Grant(src) + wrap_action = new() + wrap_action.Grant(src) + name += " ([rand(1, 1000)])" msg_terrorspiders("[src] has grown in [get_area(src)].") if(is_away_level(z)) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm index 1791aa9bc41..a2452abe2ed 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm @@ -1,10 +1,27 @@ + +/datum/action/innate/terrorspider/web + name = "Web" + icon_icon = 'icons/effects/effects.dmi' + button_icon_state = "stickyweb1" + +/datum/action/innate/terrorspider/web/Activate() + var/mob/living/simple_animal/hostile/poison/terror_spider/user = owner + user.Web() + +/datum/action/innate/terrorspider/wrap + name = "Wrap" + icon_icon = 'icons/effects/effects.dmi' + button_icon_state = "cocoon_large1" + +/datum/action/innate/terrorspider/wrap/Activate() + var/mob/living/simple_animal/hostile/poison/terror_spider/user = owner + user.DoWrap() + + // ---------- WEB -/mob/living/simple_animal/hostile/poison/terror_spider/verb/Web() - set name = "Lay Web" - set category = "Spider" - set desc = "Spin a sticky web to slow down prey." +/mob/living/simple_animal/hostile/poison/terror_spider/proc/Web() visible_message("\the [src] begins to secrete a sticky substance.") if(do_after(src, 40, target = loc)) new /obj/effect/spider/terrorweb(loc) @@ -47,11 +64,6 @@ // ---------- WRAP -/mob/living/simple_animal/hostile/poison/terror_spider/verb/Wrap() - set name = "Wrap" - set category = "Spider" - set desc = "Wrap up corpses (and possibly other ajacent objects)" - DoWrap() /mob/living/simple_animal/hostile/poison/terror_spider/proc/DoWrap() if(!cocoon_target) From 7403c3d830f1b46d11b11f574123172de4f6f51b Mon Sep 17 00:00:00 2001 From: Kyep Date: Tue, 30 Aug 2016 01:08:41 -0700 Subject: [PATCH 07/15] RMs chem defs, mv's verb file, adds ghost icons --- .../hostile/terror_spiders/{verbs.dm => actions.dm} | 0 .../simple_animal/hostile/terror_spiders/chem.dm | 8 -------- .../hostile/terror_spiders/terror_spiders.dm | 10 +++++++--- paradise.dme | 2 +- 4 files changed, 8 insertions(+), 12 deletions(-) rename code/modules/mob/living/simple_animal/hostile/terror_spiders/{verbs.dm => actions.dm} (100%) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm similarity index 100% rename from code/modules/mob/living/simple_animal/hostile/terror_spiders/verbs.dm rename to code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm index 01c11e9944f..e2fa4ed5964 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm @@ -1,17 +1,9 @@ -#define SOLID 1 -#define LIQUID 2 -#define GAS 3 -#define FOOD_METABOLISM 0.4 -#define REM REAGENTS_EFFECT_MULTIPLIER - - // Terror Spider, Black, Deadly Venom /datum/reagent/terror_black_toxin name = "Black Widow venom" id = "terror_black_toxin" description = "An incredibly toxic venom injected by the Black Widow spider." - reagent_state = LIQUID color = "#CF3600" metabolization_rate = 0.1 diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm index 85fec613c91..e21a4d3e063 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -229,10 +229,14 @@ var/global/list/ts_spiderlist = list() spawn(300) // deciseconds! if(spider_awaymission) return - else if(ckey) - notify_ghosts("[src] has appeared in [get_area(src)]. (already player-controlled)") + if(stat == DEAD) + return + if(ckey) + var/image/alert_overlay = image('icons/mob/terrorspider.dmi', icon_state) + notify_ghosts("[src] has appeared in [get_area(src)]. (already player-controlled)", source = src, alert_overlay = alert_overlay) else if(ai_playercontrol_allowingeneral && ai_playercontrol_allowtype) - notify_ghosts("[src] has appeared in [get_area(src)].", enter_link = "(Click to control)", source = src) + var/image/alert_overlay = image('icons/mob/terrorspider.dmi', icon_state) + notify_ghosts("[src] has appeared in [get_area(src)].", enter_link = "(Click to control)", source = src, alert_overlay = alert_overlay, attack_not_jump = 1) /mob/living/simple_animal/hostile/poison/terror_spider/Destroy() ts_spiderlist -= src diff --git a/paradise.dme b/paradise.dme index 635775cab0e..37dc8303848 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1660,6 +1660,7 @@ #include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\undead.dm" #include "code\modules\mob\living\simple_animal\hostile\terror_spiders\__defines.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\actions.dm" #include "code\modules\mob\living\simple_animal\hostile\terror_spiders\black.dm" #include "code\modules\mob\living\simple_animal\hostile\terror_spiders\chem.dm" #include "code\modules\mob\living\simple_animal\hostile\terror_spiders\ghost.dm" @@ -1667,7 +1668,6 @@ #include "code\modules\mob\living\simple_animal\hostile\terror_spiders\prince.dm" #include "code\modules\mob\living\simple_animal\hostile\terror_spiders\red.dm" #include "code\modules\mob\living\simple_animal\hostile\terror_spiders\terror_spiders.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\verbs.dm" #include "code\modules\mob\new_player\login.dm" #include "code\modules\mob\new_player\logout.dm" #include "code\modules\mob\new_player\new_player.dm" From f5ddbecfa74dba968e30887adab86e27bab8ff63 Mon Sep 17 00:00:00 2001 From: Kyep Date: Sat, 3 Sep 2016 20:30:09 -0700 Subject: [PATCH 08/15] Sprite Update 1) Replaced black spider sprite & tweaked its description to reference the hourglass. 2) Replaced prince spider sprite & tweaked its description to reference its combat experience 3) Tweaked red spider description. 4) Nerfed spider regeneration ability, reducing HP/min regeneration by 1/3rd 5) Deleted an instance of (/var... in a proc definition. --- .../hostile/terror_spiders/black.dm | 13 ++++++------- .../hostile/terror_spiders/prince.dm | 12 ++++++------ .../hostile/terror_spiders/red.dm | 2 +- .../hostile/terror_spiders/terror_spiders.dm | 8 ++++---- icons/mob/terrorspider.dmi | Bin 35431 -> 48714 bytes 5 files changed, 17 insertions(+), 18 deletions(-) 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 8566cc1e476..5b6d89f9a25 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 @@ -7,16 +7,16 @@ // -------------: SPECIAL: venom that does more damage the more of it is in you // -------------: TO FIGHT IT: if bitten once, retreat, get charcoal/etc treatment, and come back with a gun. // -------------: CONCEPT: http://tvtropes.org/pmwiki/pmwiki.php/Main/GradualGrinder -// -------------: SPRITES FROM: Travelling Merchant, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=2766 +// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386 /mob/living/simple_animal/hostile/poison/terror_spider/black name = "Black Terror spider" - desc = "An ominous-looking spider, black as the darkest night, and with merciless yellow eyes." + desc = "An ominous-looking spider, black as the darkest night, and with merciless eyes and a blood-red hourglass pattern on its back." spider_role_summary = "Hit-and-run attacker with extremely venomous bite." - icon_state = "terror_black" - icon_living = "terror_black" - icon_dead = "terror_black_dead" + icon_state = "terror_widow" + icon_living = "terror_widow" + icon_dead = "terror_widow_dead" maxHealth = 120 // same health as hunter spider, aka, pretty weak.. but its bite will kill you! health = 120 melee_damage_lower = 5 @@ -25,7 +25,6 @@ stat_attack = 1 // ensures they will target people in crit, too! spider_tier = TS_TIER_2 - /mob/living/simple_animal/hostile/poison/terror_spider/black/spider_specialattack(mob/living/carbon/human/L, poisonable) if(!poisonable) return ..() @@ -37,4 +36,4 @@ visible_message("[src] buries its long fangs deep into the [inject_target] of [target]!") else visible_message("[src] bites [target], but cannot inject venom into their [inject_target]!") - L.attack_animal(src) \ No newline at end of file + L.attack_animal(src) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm index 1069ae13e05..531fad1f330 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm @@ -8,15 +8,15 @@ // -------------: TO FIGHT IT: a squad of at least 4 people with laser rifles. // -------------: CONCEPT: http://tvtropes.org/pmwiki/pmwiki.php/Main/LightningBruiser // -------------: CONCEPT: http://tvtropes.org/pmwiki/pmwiki.php/Main/WakeupCallBoss -// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386 +// -------------: SPRITES FROM: Travelling Merchant, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=2766 /mob/living/simple_animal/hostile/poison/terror_spider/prince name = "Prince of Terror spider" - desc = "An enormous, terrifying spider. It looks like it is judging everything it sees. Extremely dangerous." + desc = "An enormous, terrifying spider. It looks like it is judging everything it sees. Its hide seems armored, and it bears the scars of many battles." spider_role_summary = "Boss-level terror spider. Lightning bruiser. Capable of taking on a squad by itself." - icon_state = "terror_queen" - icon_living = "terror_queen" - icon_dead = "terror_queen_dead" + icon_state = "terror_allblack" + icon_living = "terror_allblack" + icon_dead = "terror_allblack_dead" maxHealth = 400 // 20 laser shots. health = 400 melee_damage_lower = 15 @@ -28,7 +28,7 @@ spider_opens_doors = 2 -/mob/living/simple_animal/hostile/poison/terror_spider/prince/spider_specialattack(var/mob/living/carbon/human/L) +/mob/living/simple_animal/hostile/poison/terror_spider/prince/spider_specialattack(mob/living/carbon/human/L) if(prob(15)) visible_message("[src] rams into [L], knocking them to the floor!") L.Weaken(5) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm index 2aae9980d13..0ac164c2e56 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm @@ -12,7 +12,7 @@ /mob/living/simple_animal/hostile/poison/terror_spider/red name = "Red Terror spider" - desc = "An ominous-looking red spider, it has eight beady red eyes, and nasty, big, pointy fangs!" + desc = "An ominous-looking red spider, it has eight beady red eyes, and nasty, big, pointy fangs! It looks like it has a vicious streak a mile wide." spider_role_summary = "High health, high damage, very slow, melee juggernaut" diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm index e21a4d3e063..83068299b4e 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -57,10 +57,10 @@ var/global/list/ts_spiderlist = list() var/regen_points = 0 // number of regen points they have by default var/regen_points_max = 100 // max number of points they can accumulate var/regen_points_per_tick = 1 // gain one regen point per tick - var/regen_points_per_kill = 100 // gain extra regen points if you kill something - var/regen_points_per_hp = 2 // every X regen points = 1 health point you can regen - // desired: 30hp/minute unmolested, 60hp/min on food boost, assuming one tick every 2 seconds - // 100/kill means bonus 50hp/kill regenerated over the next 1-2 minutes + var/regen_points_per_kill = 90 // gain extra regen points if you kill something + var/regen_points_per_hp = 3 // every X regen points = 1 health point you can regen + // desired: 20hp/minute unmolested, 40hp/min on food boost, assuming one tick every 2 seconds + // 90/kill means bonus 30hp/kill regenerated over the next 1-2 minutes // Vision idle_vision_range = 10 diff --git a/icons/mob/terrorspider.dmi b/icons/mob/terrorspider.dmi index fa61f1c997931ae033a8bb1ba423cd409d16033e..a5d678f3f38ca4a72f275a3306ce7a9a53f12f22 100644 GIT binary patch literal 48714 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

HqpyTHPdJKut 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 From c43970d1c866820fd8bf3e8ceead6e97f3c71828 Mon Sep 17 00:00:00 2001 From: Kyep Date: Wed, 23 Nov 2016 14:23:04 -0800 Subject: [PATCH 09/15] PORT: Bug fixes / Crazylemon-requested changes - Fixed issue where green spiders wrapping objects only see objects they're standing on - Fixed issue where mobs passing webs got stuck for 10 seconds, even though the code said // 5 seconds - Split up FindWrapTarget() and DoWrap() (former is just for ckeyed mobs) - Replaced instances of M.confused = max(M.confused, 3) with M.Confused(3) and similar for M.EyeBlurry() - Fixed bug where Destroy()-ed spiders don't call Death() and don't decrement ts_count_alive. --- .../hostile/terror_spiders/actions.dm | 21 ++++++++++--------- .../hostile/terror_spiders/chem.dm | 10 ++++----- .../hostile/terror_spiders/ghost.dm | 2 +- .../hostile/terror_spiders/gray.dm | 2 +- .../hostile/terror_spiders/terror_spiders.dm | 16 ++++++++------ 5 files changed, 28 insertions(+), 23 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm index a2452abe2ed..e8e999ee486 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm @@ -16,6 +16,7 @@ /datum/action/innate/terrorspider/wrap/Activate() var/mob/living/simple_animal/hostile/poison/terror_spider/user = owner + user.FindWrapTarget() user.DoWrap() @@ -49,8 +50,8 @@ if(prob(80)) to_chat(mover, "You get stuck in \the [src] for a moment.") var/mob/living/M = mover - M.Stun(5) // 5 seconds. - M.Weaken(5) // 5 seconds. + M.Stun(4) // 8 seconds. + M.Weaken(4) // 8 seconds. return 1 else return 0 @@ -64,23 +65,23 @@ // ---------- WRAP - -/mob/living/simple_animal/hostile/poison/terror_spider/proc/DoWrap() +/mob/living/simple_animal/hostile/poison/terror_spider/proc/FindWrapTarget() if(!cocoon_target) var/list/choices = list() for(var/mob/living/L in oview(1,src)) if(Adjacent(L)) if(L.stat == DEAD) choices += L - for(var/obj/O in loc) + for(var/obj/O in oview(1,src)) if(Adjacent(O) && !O.anchored) if(!istype(O, /obj/effect/spider/terrorweb) && !istype(O, /obj/effect/spider/cocoon)) choices += O - if(ckey) - if(choices.len) - cocoon_target = input(src,"What do you wish to cocoon?") in null|choices - else - to_chat(src, "There is nothing nearby you can wrap.") + if(choices.len) + cocoon_target = input(src,"What do you wish to cocoon?") in null|choices + else + to_chat(src, "There is nothing nearby you can wrap.") + +/mob/living/simple_animal/hostile/poison/terror_spider/proc/DoWrap() if(cocoon_target && busy != SPINNING_COCOON) busy = SPINNING_COCOON visible_message("\the [src] begins to secrete a sticky substance around \the [cocoon_target].") diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm index e2fa4ed5964..8ad926a8729 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm @@ -16,18 +16,18 @@ // bitten twice, die more quickly, muscle cramps make movement difficult. Call medics immediately. // total damage: 4, human health 150 until crit, = 37.5 ticks, = 75s = 1m15s until death M.adjustToxLoss(4) - M.confused = max(M.confused, 3) - M.eye_blurry = max(M.eye_blurry, 3) + M.Confused(3) + M.EyeBlurry(3) else if(volume < 45) // bitten thrice, die very quickly, severe muscle cramps make movement very difficult. Even calling for help probably won't save you. // total damage: 8, human health 150 until crit, = 18.75 ticks, = 37s until death M.adjustToxLoss(8) // a bit worse than coiine - M.confused = max(M.confused, 6) - M.eye_blurry = max(M.eye_blurry, 6) + M.Confused(6) + M.EyeBlurry(6) else // bitten 4 or more times, whole body goes into shock/death // total damage: 12, human health 150 until crit, = 12.5 ticks, = 25s until death M.adjustToxLoss(12) - M.eye_blurry = max(M.eye_blurry, 9) + M.EyeBlurry(6) M.Paralyse(5) ..() diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm index 7d85354073f..06703cc2106 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm @@ -22,7 +22,7 @@ error_on_humanize = "Terror spiders that are part of an away mission cannot be controlled by ghosts." else if(!ai_playercontrol_allowtype) error_on_humanize = "This specific type of terror spider is not player-controllable." - else if(health == 0) + else if(stat == DEAD) error_on_humanize = "Dead spiders are not player-controllable." if(jobban_isbanned(user, "Syndicate") || jobban_isbanned(user, "alien")) to_chat(user,"You are jobbanned from role of syndicate and/or alien lifeform.") 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 4da8c21e812..42c16cc7666 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 @@ -33,7 +33,7 @@ else var/inject_target = pick("chest","head") if(L.stunned || L.can_inject(null,0,inject_target,0)) - L.silent = max(L.silent, 20) // instead of having a venom that only lasts seconds, we just add the silence directly. + L.Silence(20) // instead of having a venom that only lasts seconds, we just add the silence directly. visible_message("[src] buries grey fangs deep into the [inject_target] of [target]!") else visible_message("[src] bites [target], but cannot inject venom into their [inject_target]!") diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm index 83068299b4e..95019bf1774 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -89,13 +89,13 @@ var/global/list/ts_spiderlist = list() var/travelling_in_vent = 0 var/busy = 0 // leave this alone! var/spider_tier = TS_TIER_1 // 1 for red,gray,green. 2 for purple,black,white, 3 for prince, mother. 4 for queen, 5 for empress. + var/hasdied = 0 var/attackstep = 0 var/attackcycles = 0 var/mylocation = null var/chasecycles = 0 var/last_cocoon_object = 0 // leave this, changed by procs. var/killcount = 0 - var/hasdroppedloot = 0 // Breathing, Pressure & Fire // - No breathing / cannot be suffocated (spiders can hold their breath, look it up) @@ -240,6 +240,7 @@ var/global/list/ts_spiderlist = list() /mob/living/simple_animal/hostile/poison/terror_spider/Destroy() ts_spiderlist -= src + handle_dying() return ..() /mob/living/simple_animal/hostile/poison/terror_spider/Life() @@ -264,17 +265,20 @@ var/global/list/ts_spiderlist = list() ..() -/mob/living/simple_animal/hostile/poison/terror_spider/death(gibbed) - if(!gibbed) - msg_terrorspiders("[src] has died in [get_area(src)].") - if(!hasdroppedloot) - hasdroppedloot = 1 +/mob/living/simple_animal/hostile/poison/terror_spider/proc/handle_dying() + if(!hasdied) + hasdied = 1 ts_count_dead++ ts_death_last = world.time if(spider_awaymission) ts_count_alive_awaymission-- else ts_count_alive_station-- + +/mob/living/simple_animal/hostile/poison/terror_spider/death(gibbed) + if(!gibbed) + msg_terrorspiders("[src] has died in [get_area(src)].") + handle_dying() ..() From b8a8eeb2c032002cac9ce711fbe4aeaf945c7172 Mon Sep 17 00:00:00 2001 From: Kyep Date: Sat, 26 Nov 2016 22:21:04 -0800 Subject: [PATCH 10/15] Updated text color --- goon/browserassets/css/browserOutput.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css index 1f4777a0dcf..3a4ff4c3770 100644 --- a/goon/browserassets/css/browserOutput.css +++ b/goon/browserassets/css/browserOutput.css @@ -291,7 +291,7 @@ h1.alert, h2.alert {color: #000000;} .alien {color: #543354;} .noticealien {color: #00c000;} .alertalien {color: #00c000; font-weight: bold;} -.terrorspider {color: #543354;} +.terrorspider {color: #320E32;} .sinister {color: #800080; font-weight: bold; font-style: italic;} /* /vg/ */ From 548381e830db6a919e6288ee14615fe2e1c5db0e Mon Sep 17 00:00:00 2001 From: Kyep Date: Thu, 8 Dec 2016 22:49:30 -0800 Subject: [PATCH 11/15] Tiger-requested changes --- code/modules/mob/language.dm | 4 +-- .../hostile/terror_spiders/actions.dm | 27 ++++++++----------- .../hostile/terror_spiders/terror_spiders.dm | 15 +++++------ 3 files changed, 20 insertions(+), 26 deletions(-) diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 440883541b3..be101742dfa 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -430,7 +430,7 @@ /datum/language/terrorspider - name = "TerrorSpider" + name = "Spider Hivemind" desc = "Terror spiders have a limited ability to commune over a psychic hivemind, similar to xenomorphs." speech_verb = "chitters" ask_verb = "chitters" @@ -572,7 +572,7 @@ flags = RESTRICTED | HIVEMIND drone_only = 1 follow = 1 - + /datum/language/drone name = "Drone" desc = "An encrypted stream of data converted to speech patterns." diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm index e8e999ee486..e59c546347a 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm @@ -23,7 +23,7 @@ // ---------- WEB /mob/living/simple_animal/hostile/poison/terror_spider/proc/Web() - visible_message("\the [src] begins to secrete a sticky substance.") + visible_message("[src] begins to secrete a sticky substance.") if(do_after(src, 40, target = loc)) new /obj/effect/spider/terrorweb(loc) @@ -42,13 +42,12 @@ icon_state = "stickyweb2" -/obj/effect/spider/terrorweb/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if(air_group || (height==0)) return 1 +/obj/effect/spider/terrorweb/CanPass(atom/movable/mover, turf/target) if(istype(mover, /mob/living/simple_animal/hostile/poison/terror_spider)) return 1 - if(istype(mover, /mob/living)) + if(isliving(mover)) if(prob(80)) - to_chat(mover, "You get stuck in \the [src] for a moment.") + to_chat(mover, "You get stuck in [src] for a moment.") var/mob/living/M = mover M.Stun(4) // 8 seconds. M.Weaken(4) // 8 seconds. @@ -84,7 +83,7 @@ /mob/living/simple_animal/hostile/poison/terror_spider/proc/DoWrap() if(cocoon_target && busy != SPINNING_COCOON) busy = SPINNING_COCOON - visible_message("\the [src] begins to secrete a sticky substance around \the [cocoon_target].") + visible_message("[src] begins to secrete a sticky substance around [cocoon_target].") stop_automated_movement = 1 walk(src,0) if(do_after(src, 40, target = cocoon_target.loc)) @@ -94,15 +93,11 @@ var/large_cocoon = 0 C.pixel_x = cocoon_target.pixel_x C.pixel_y = cocoon_target.pixel_y - for(var/obj/item/I in C.loc) - I.loc = C - for(var/obj/structure/S in C.loc) - if(!S.anchored) - S.loc = C - large_cocoon = 1 - for(var/obj/machinery/M in C.loc) - if(!M.anchored) - M.loc = C + for(var/obj/O in C.loc) + if(istype(O, /obj/item)) + O.loc = C + else if(istype(O, /obj/machinery) || istype(O, /obj/structure)) + O.loc = C large_cocoon = 1 for(var/mob/living/L in C.loc) if(istype(L, /mob/living/simple_animal/hostile/poison/terror_spider)) @@ -117,7 +112,7 @@ L.loc = C C.pixel_x = L.pixel_x C.pixel_y = L.pixel_y - visible_message("\the [src] sticks a proboscis into \the [L] and sucks a viscous substance out.") + visible_message("[src] sticks a proboscis into [L] and sucks a viscous substance out.") break if(large_cocoon) C.icon_state = pick("cocoon_large1","cocoon_large2","cocoon_large3") diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm index 95019bf1774..88826dc86ee 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -12,7 +12,7 @@ var/global/list/ts_spiderlist = list() // -------------------------------------------------------------------------------- // Because: http://tvtropes.org/pmwiki/pmwiki.php/Main/SpidersAreScary -/mob/living/simple_animal/hostile/poison/terror_spider/ +/mob/living/simple_animal/hostile/poison/terror_spider // Name / Description name = "terror spider" desc = "The generic parent of all other terror spider types. If you see this in-game, it is a bug." @@ -196,11 +196,9 @@ var/global/list/ts_spiderlist = list() else if(health > (maxHealth*0.25)) msgs += "It is barely clinging on to life!" else if(health < maxHealth && regen_points > regen_points_per_kill) - msgs += "It appears to be regenerating quickly" - if(killcount == 1) - msgs += "It is soaked in the blood of its prey." - if(killcount > 1) - msgs += "It is soaked with the blood of [killcount] prey it has killed." + msgs += "It appears to be regenerating quickly." + if(killcount >= 1) + msgs += "It has blood dribbling from its mouth." to_chat(usr,msgs.Join("
")) @@ -244,7 +242,8 @@ var/global/list/ts_spiderlist = list() return ..() /mob/living/simple_animal/hostile/poison/terror_spider/Life() - if(stat != DEAD) + . = ..() + if(!.) // if mob is alive if(regen_points < regen_points_max) regen_points += regen_points_per_tick if((bruteloss > 0) || (fireloss > 0)) @@ -262,7 +261,7 @@ var/global/list/ts_spiderlist = list() // 2% chance every cycle to decompose visible_message("\The dead body of the [src] decomposes!") gib() - ..() + /mob/living/simple_animal/hostile/poison/terror_spider/proc/handle_dying() From 0d4ae037ab315a08cd9475b2e122963f0836bf3f Mon Sep 17 00:00:00 2001 From: Kyep Date: Fri, 9 Dec 2016 22:43:13 -0800 Subject: [PATCH 12/15] More Tiger Requests --- .../hostile/terror_spiders/terror_spiders.dm | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm index 88826dc86ee..6b78b26eaee 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -124,9 +124,9 @@ var/global/list/ts_spiderlist = list() if(istype(target, /mob/living/simple_animal/hostile/poison/terror_spider)) var/mob/living/simple_animal/hostile/poison/terror_spider/T = target if(T.spider_tier > spider_tier) - visible_message("[src] bows in respect for the terrifying presence of [target]") + visible_message("[src] bows in respect for the terrifying presence of [target].") else if(T.spider_tier == spider_tier) - visible_message("[src] harmlessly nuzzles [target].") + visible_message("[src] nuzzles [target].") else if(T.spider_tier < spider_tier && spider_tier >= 4) visible_message("[src] gives [target] a stern look.") else @@ -183,7 +183,7 @@ var/global/list/ts_spiderlist = list() ..() var/list/msgs = list() if(stat == DEAD) - msgs += "It appears to be dead.\n" + msgs += "It appears to be dead.\n" else if(key) msgs += "Its eyes regard you with a curious intelligence." @@ -205,9 +205,9 @@ var/global/list/ts_spiderlist = list() /mob/living/simple_animal/hostile/poison/terror_spider/New() ..() ts_spiderlist += src - add_language("TerrorSpider") + add_language("Spider Hivemind") add_language("Galactic Common") - default_language = all_languages["TerrorSpider"] + default_language = all_languages["Spider Hivemind"] web_action = new() web_action.Grant(src) @@ -310,19 +310,18 @@ var/global/list/ts_spiderlist = list() if(D.operating) return if(!D.density) - to_chat(src, "Closing doors does not help us.") + to_chat(src, "Closing doors does not help us.") else if(D.welded) - to_chat(src, "The door is welded shut.") + to_chat(src, "The door is welded shut.") else if(D.locked) - to_chat(src, "The door is bolted shut.") - else if( (!istype(D.req_access) || !D.req_access.len) && (!istype(D.req_one_access) || !D.req_one_access.len) && (D.req_access_txt == "0") && (D.req_one_access_txt == "0") ) - //visible_message("\the [src] opens the public-access door [D]!") + to_chat(src, "The door is bolted shut.") + else if(D.allowed(src)) D.open(1) else if(D.arePowerSystemsOn() && (spider_opens_doors != 2)) - to_chat(src, "The door's motors resist your efforts to force it.") + to_chat(src, "The door's motors resist your efforts to force it.") else if(!spider_opens_doors) - to_chat(src, "Your type of spider is not strong enough to force open doors.") + to_chat(src, "Your type of spider is not strong enough to force open doors.") else - visible_message("\the [src] pries open the door!") + visible_message("[src] pries open the door!") playsound(src.loc, "sparks", 100, 1) D.open(1) \ No newline at end of file From b253a934842204692d91f3f49ddf2e7d1f3902dd Mon Sep 17 00:00:00 2001 From: Kyep Date: Thu, 22 Dec 2016 02:09:21 -0800 Subject: [PATCH 13/15] Fox requests --- .../hostile/terror_spiders/actions.dm | 2 +- .../hostile/terror_spiders/terror_spiders.dm | 29 ++++++++++--------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm index e59c546347a..5c573ae82ea 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm @@ -88,7 +88,7 @@ walk(src,0) if(do_after(src, 40, target = cocoon_target.loc)) if(busy == SPINNING_COCOON) - if(cocoon_target && istype(cocoon_target.loc, /turf) && get_dist(src,cocoon_target) <= 1) + if(cocoon_target && isturf(cocoon_target.loc) && get_dist(src,cocoon_target) <= 1) var/obj/effect/spider/cocoon/C = new(cocoon_target.loc) var/large_cocoon = 0 C.pixel_x = cocoon_target.pixel_x diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm index 6b78b26eaee..143c5e28750 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -156,7 +156,7 @@ var/global/list/ts_spiderlist = list() return else if(G.reagents && (iscarbon(G))) var/can_poison = 1 - if(istype(G, /mob/living/carbon/human/)) + if(ishuman(G)) var/mob/living/carbon/human/H = G if(!(H.species.reagent_tag & PROCESS_ORG) || (H.species.flags & NO_POISON)) can_poison = 0 @@ -222,19 +222,20 @@ var/global/list/ts_spiderlist = list() else ts_count_alive_station++ // after 30 seconds, assuming nobody took control of it yet, offer it to ghosts. - spawn(150) // deciseconds! - CheckFaction() - spawn(300) // deciseconds! - if(spider_awaymission) - return - if(stat == DEAD) - return - if(ckey) - var/image/alert_overlay = image('icons/mob/terrorspider.dmi', icon_state) - notify_ghosts("[src] has appeared in [get_area(src)]. (already player-controlled)", source = src, alert_overlay = alert_overlay) - else if(ai_playercontrol_allowingeneral && ai_playercontrol_allowtype) - var/image/alert_overlay = image('icons/mob/terrorspider.dmi', icon_state) - notify_ghosts("[src] has appeared in [get_area(src)].", enter_link = "
(Click to control)", source = src, alert_overlay = alert_overlay, attack_not_jump = 1) + addtimer(src, "CheckFaction", 150) + addtimer(src, "announcetoghosts", 300) + +/mob/living/simple_animal/hostile/poison/terror_spider/proc/announcetoghosts() + if(spider_awaymission) + return + if(stat == DEAD) + return + if(ckey) + var/image/alert_overlay = image('icons/mob/terrorspider.dmi', icon_state) + notify_ghosts("[src] has appeared in [get_area(src)]. (already player-controlled)", source = src, alert_overlay = alert_overlay) + else if(ai_playercontrol_allowingeneral && ai_playercontrol_allowtype) + var/image/alert_overlay = image('icons/mob/terrorspider.dmi', icon_state) + notify_ghosts("[src] has appeared in [get_area(src)].", enter_link = "(Click to control)", source = src, alert_overlay = alert_overlay, attack_not_jump = 1) /mob/living/simple_animal/hostile/poison/terror_spider/Destroy() ts_spiderlist -= src From c29fd56fc760d13da1ea5cba68be994bf6f9476f Mon Sep 17 00:00:00 2001 From: Kyep Date: Sat, 24 Dec 2016 00:37:14 -0800 Subject: [PATCH 14/15] Deletes Tvtropes links :( --- .../mob/living/simple_animal/hostile/terror_spiders/black.dm | 1 - .../mob/living/simple_animal/hostile/terror_spiders/prince.dm | 2 -- .../mob/living/simple_animal/hostile/terror_spiders/red.dm | 1 - 3 files changed, 4 deletions(-) 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 5b6d89f9a25..68d25a29492 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 @@ -6,7 +6,6 @@ // -------------: AI: attacks to inject its venom, then retreats. Will inject its enemies multiple times then hang back to ensure they die. // -------------: SPECIAL: venom that does more damage the more of it is in you // -------------: TO FIGHT IT: if bitten once, retreat, get charcoal/etc treatment, and come back with a gun. -// -------------: CONCEPT: http://tvtropes.org/pmwiki/pmwiki.php/Main/GradualGrinder // -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386 /mob/living/simple_animal/hostile/poison/terror_spider/black diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm index 531fad1f330..669449a6ae3 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm @@ -6,8 +6,6 @@ // -------------: AI: no special ai // -------------: SPECIAL: massive health // -------------: TO FIGHT IT: a squad of at least 4 people with laser rifles. -// -------------: CONCEPT: http://tvtropes.org/pmwiki/pmwiki.php/Main/LightningBruiser -// -------------: CONCEPT: http://tvtropes.org/pmwiki/pmwiki.php/Main/WakeupCallBoss // -------------: SPRITES FROM: Travelling Merchant, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=2766 /mob/living/simple_animal/hostile/poison/terror_spider/prince diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm index 0ac164c2e56..33480f9509c 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm @@ -7,7 +7,6 @@ // -------------: AI: uses very powerful fangs to wreck people in melee // -------------: SPECIAL: the more you hurt it, the harder it bites you // -------------: TO FIGHT IT: shoot it from range. Kite it. -// -------------: CONCEPT: http://tvtropes.org/pmwiki/pmwiki.php/Main/MightyGlacier // -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386 /mob/living/simple_animal/hostile/poison/terror_spider/red From d62038a3366d4865337bae09c1fb8ba22c9f2833 Mon Sep 17 00:00:00 2001 From: Kyep Date: Thu, 29 Dec 2016 23:41:32 -0800 Subject: [PATCH 15/15] Crazylemon Changes 1) Changed \ref and ..() per Crazylemon's request 2) Fixed a bug with Life() that was causing regeneration not to work --- .../hostile/terror_spiders/actions.dm | 1 + .../hostile/terror_spiders/terror_spiders.dm | 17 +++++++++-------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm index 5c573ae82ea..963bfd472fd 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm @@ -38,6 +38,7 @@ /obj/effect/spider/terrorweb/New() + ..() if(prob(50)) icon_state = "stickyweb2" diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm index 143c5e28750..67683d39b39 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -235,7 +235,7 @@ var/global/list/ts_spiderlist = list() notify_ghosts("[src] has appeared in [get_area(src)]. (already player-controlled)", source = src, alert_overlay = alert_overlay) else if(ai_playercontrol_allowingeneral && ai_playercontrol_allowtype) var/image/alert_overlay = image('icons/mob/terrorspider.dmi', icon_state) - notify_ghosts("[src] has appeared in [get_area(src)].", enter_link = "(Click to control)", source = src, alert_overlay = alert_overlay, attack_not_jump = 1) + notify_ghosts("[src] has appeared in [get_area(src)].", enter_link = "(Click to control)", source = src, alert_overlay = alert_overlay, attack_not_jump = 1) /mob/living/simple_animal/hostile/poison/terror_spider/Destroy() ts_spiderlist -= src @@ -243,8 +243,13 @@ var/global/list/ts_spiderlist = list() return ..() /mob/living/simple_animal/hostile/poison/terror_spider/Life() - . = ..() - if(!.) // if mob is alive + ..() + if(stat == DEAD) + if(prob(2)) + // 2% chance every cycle to decompose + visible_message("\The dead body of the [src] decomposes!") + gib() + else if(regen_points < regen_points_max) regen_points += regen_points_per_tick if((bruteloss > 0) || (fireloss > 0)) @@ -257,11 +262,7 @@ var/global/list/ts_spiderlist = list() regen_points -= regen_points_per_hp if(prob(5)) CheckFaction() - else if(stat == DEAD) - if(prob(2)) - // 2% chance every cycle to decompose - visible_message("\The dead body of the [src] decomposes!") - gib() +