Merge branch 'master' of https://github.com/tgstation/-tg-station into petemilking

Conflicts:
	code/modules/mob/living/simple_animal/friendly/farm_animals.dm
This commit is contained in:
Aranclanos
2015-08-29 23:14:57 -03:00
122 changed files with 1414 additions and 468 deletions
+2 -2
View File
@@ -1,7 +1,7 @@
/*
HOW DO I LOG RUNTIMES?
Firstly, start dreamdeamon if it isn't already running. Then select "world>Log Session" (or press the F3 key)
navigate the popup window to the data/logs/runtime/ folder from where your tgstation .dmb is located.
navigate the popup window to the data/logs/runtimes/ folder from where your tgstation .dmb is located.
(you may have to make this folder yourself)
OPTIONAL: you can select the little checkbox down the bottom to make dreamdeamon save the log everytime you
@@ -44,7 +44,7 @@
set desc = "Retrieve any session logfiles saved by dreamdeamon."
set category = null
var/path = browse_files("data/logs/runtime/")
var/path = browse_files("data/logs/runtimes/")
if(!path)
return
@@ -10,6 +10,7 @@
var/basestate = "hardsuit"
var/brightness_on = 4 //luminosity when on
var/on = 0
var/obj/item/clothing/suit/space/hardsuit/suit
item_color = "engineering" //Determines used sprites: hardsuit[on]-[color] and hardsuit[on]-[color]2 (lying down sprite)
action_button_name = "Toggle Helmet Light"
flags = BLOCKHAIR | STOPSPRESSUREDMAGE | THICKMATERIAL | NODROP
+1 -1
View File
@@ -105,7 +105,7 @@
/obj/item/clothing/suit/armor/laserproof/IsReflect(def_zone)
if(!(def_zone in list("chest", "groin"))) //If not shot where ablative is covering you, you don't get the reflection bonus!
hit_reflect_chance = 0
return 0
if (prob(hit_reflect_chance))
return 1
+11 -3
View File
@@ -90,7 +90,6 @@
user << "Alt-click on [src] to toggle the [togglename]."
//Hardsuit toggle code
/obj/item/clothing/suit/space/hardsuit/New()
MakeHelmet()
if(!jetpack)
@@ -98,15 +97,24 @@
verbs -= /obj/item/clothing/suit/space/hardsuit/verb/Jetpack_Rockets
..()
/obj/item/clothing/suit/space/hardsuit/Destroy()
qdel(helmet)
if(helmet)
helmet.suit = null
qdel(helmet)
qdel(jetpack)
..()
/obj/item/clothing/head/helmet/space/hardsuit/Destroy()
if(suit)
suit.helmet = null
qdel(suit)
..()
/obj/item/clothing/suit/space/hardsuit/proc/MakeHelmet()
if(!helmettype)
return
if(!helmet)
var/obj/item/clothing/head/helmet/space/hardsuit/W = new helmettype(src)
W.suit = src
helmet = W
/obj/item/clothing/suit/space/hardsuit/ui_action_click()
@@ -121,7 +129,7 @@
..()
/obj/item/clothing/suit/space/hardsuit/proc/RemoveHelmet()
if(!helmettype)
if(!helmet)
return
suittoggled = 0
if(ishuman(helmet.loc))
+1 -5
View File
@@ -7,7 +7,6 @@
/datum/round_event/brand_intelligence
announceWhen = 21
endWhen = 1000 //Ends when all vending machines are subverted anyway.
var/list/obj/machinery/vending/vendingMachines = list()
var/list/obj/machinery/vending/infectedMachines = list()
var/obj/machinery/vending/originMachine
@@ -28,11 +27,9 @@
for(var/obj/machinery/vending/V in machines)
if(V.z != 1) continue
vendingMachines.Add(V)
if(!vendingMachines.len)
kill()
return
originMachine = pick(vendingMachines)
vendingMachines.Remove(originMachine)
originMachine.shut_up = 0
@@ -48,7 +45,7 @@
originMachine.visible_message("[originMachine] beeps and seems lifeless.")
kill()
return
vendingMachines = removeNullsFromList(vendingMachines)
if(!vendingMachines.len) //if every machine is infected
for(var/obj/machinery/vending/upriser in infectedMachines)
if(prob(70) && !upriser.gc_destroyed)
@@ -62,7 +59,6 @@
kill()
return
if(IsMultiple(activeFor, 4))
var/obj/machinery/vending/rebel = pick(vendingMachines)
vendingMachines.Remove(rebel)
-1
View File
@@ -66,7 +66,6 @@
color = "#aa77aa"
icon_state = "vinefloor"
broken_states = list()
ignoredirt = 1
//All of this shit is useless for vines
+14 -13
View File
@@ -188,19 +188,20 @@ Gunshots/explosions/opening doors/less rare audio (done)
if(!U.welded)
pump = U
break
xeno = new(pump.loc,target)
sleep(10)
xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32)
xeno.throw_at(target,7,1, spin = 0, diagonals_first = 1)
sleep(10)
xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32)
xeno.throw_at(pump,7,1, spin = 0, diagonals_first = 1)
sleep(10)
var/xeno_name = xeno.name
target << "<span class='notice'>[xeno_name] begins climbing into the ventilation system...</span>"
sleep(10)
qdel(xeno)
target << "<span class='notice'>[xeno_name] scrambles into the ventilation ducts!</span>"
if(pump)
xeno = new(pump.loc,target)
sleep(10)
xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32)
xeno.throw_at(target,7,1, spin = 0, diagonals_first = 1)
sleep(10)
xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32)
xeno.throw_at(pump,7,1, spin = 0, diagonals_first = 1)
sleep(10)
var/xeno_name = xeno.name
target << "<span class='notice'>[xeno_name] begins climbing into the ventilation system...</span>"
sleep(10)
qdel(xeno)
target << "<span class='notice'>[xeno_name] scrambles into the ventilation ducts!</span>"
qdel(src)
/obj/effect/hallucination/singularity_scare
+1
View File
@@ -573,6 +573,7 @@
/**********************Facehugger toy**********************/
/obj/item/clothing/mask/facehugger/toy
item_state = "facehugger_inactive"
desc = "A toy often used to play pranks on other miners by putting it in their beds. It takes a bit to recharge after latching onto something."
throwforce = 0
real = 0
-1
View File
@@ -509,7 +509,6 @@ var/global/list/rockTurfEdgeCache
icon_state = "asteroid"
icon_plating = "asteroid"
var/dug = 0 //0 = has not yet been dug, 1 = has already been dug
ignoredirt = 1
/turf/simulated/floor/plating/asteroid/airless
oxygen = 0.01
+3 -1
View File
@@ -326,7 +326,9 @@
flick("coin_[cmineral]_flip", src)
icon_state = "coin_[cmineral]_[coinflip]"
playsound(user.loc, 'sound/items/coinflip.ogg', 50, 1)
if(do_after(user, 15, target = src))
var/oldloc = loc
sleep(15)
if(loc == oldloc && user && !user.incapacitated())
user.visible_message("[user] has flipped [src]. It lands on [coinflip].", \
"<span class='notice'>You flip [src]. It lands on [coinflip].</span>", \
"<span class='italics'>You hear the clattering of loose change.</span>")
+3 -1
View File
@@ -293,7 +293,9 @@
/mob/living/carbon/human/interactive/Life()
..()
if(isnotfunc()) return
if(isnotfunc())
walk(src,0)
return
if(a_intent != "disarm")
a_intent = "disarm"
//---------------------------
@@ -73,7 +73,19 @@ In all, this is a lot like the monkey code. /N
/mob/living/carbon/alien/attack_animal(mob/living/simple_animal/M)
if(..())
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
adjustBruteLoss(damage)
switch(M.melee_damage_type)
if(BRUTE)
adjustBruteLoss(damage)
if(BURN)
adjustFireLoss(damage)
if(TOX)
adjustToxLoss(damage)
if(OXY)
adjustOxyLoss(damage)
if(CLONE)
adjustCloneLoss(damage)
if(STAMINA)
adjustStaminaLoss(damage)
updatehealth()
/mob/living/carbon/alien/attack_slime(mob/living/simple_animal/slime/M)
@@ -1,4 +1,4 @@
/mob/living/carbon/alien/humanoid/emote(act)
/mob/living/carbon/alien/humanoid/emote(act,m_type=1,message = null)
var/param = null
if (findtext(act, "-", 1, null))
@@ -7,8 +7,6 @@
act = copytext(act, 1, t1)
var/muzzled = is_muzzled()
var/m_type = 1
var/message
switch(act) //Alphabetical please
if ("deathgasp","deathgasps")
@@ -25,6 +23,10 @@
message = "<span class='name'>[src]</span> hisses."
m_type = 2
if ("me")
..()
return
if ("moan","moans")
message = "<span class='name'>[src]</span> moans!"
m_type = 2
@@ -14,7 +14,6 @@
//This is fine right now, if we're adding organ specific damage this needs to be updated
/mob/living/carbon/alien/humanoid/New()
create_reagents(1000)
AddAbility(new/obj/effect/proc_holder/alien/regurgitate(null))
..()
@@ -10,8 +10,6 @@
/mob/living/carbon/alien/humanoid/queen/New()
create_reagents(100)
//there should only be one queen
for(var/mob/living/carbon/alien/humanoid/queen/Q in living_mob_list)
if(Q == src) continue
@@ -77,17 +75,3 @@
icon_state = "queen_s"
pixel_x = -16
mob_size = MOB_SIZE_LARGE
/mob/living/carbon/alien/humanoid/queen/large/update_icons()
update_hud() //TODO: remove the need for this to be here
overlays.Cut()
if(stat == DEAD)
icon_state = "queen_dead"
else if((stat == UNCONSCIOUS && !sleeping) || weakened)
icon_state = "queen_l"
else if(sleeping || lying || resting)
icon_state = "queen_sleep"
else
icon_state = "queen_s"
for(var/image/I in overlays_standing)
overlays += I
@@ -50,4 +50,29 @@
if(lying > 0)
lying = 90 //Anything else looks retarded
..()
update_icons()
update_icons()
/mob/living/carbon/alien/humanoid/queen/large/update_icons()
update_hud() //TODO: remove the need for this to be here
overlays.Cut()
if(stat == DEAD)
icon_state = "queen_dead"
else if((stat == UNCONSCIOUS && !sleeping) || weakened)
icon_state = "queen_l"
else if(sleeping || lying || resting)
icon_state = "queen_sleep"
else
icon_state = "queen_s"
for(var/image/I in overlays_standing)
overlays += I
/mob/living/carbon/alien/humanoid/queen/large/update_inv_l_hand()
remove_overlay(L_HAND_LAYER)
if(handcuffed)
drop_l_hand()
/mob/living/carbon/alien/humanoid/queen/large/update_inv_r_hand()
remove_overlay(R_HAND_LAYER)
if(handcuffed)
drop_r_hand()
@@ -73,15 +73,17 @@
/obj/item/organ/internal/alien/plasmavessel/on_life()
//If there are alien weeds on the ground then heal if needed or give some plasma
if(locate(/obj/structure/alien/weeds) in owner.loc)
if(owner.health >= owner.maxHealth - owner.getCloneLoss())
if(owner.health >= owner.maxHealth)
owner.adjustPlasma(plasma_rate)
else
var/mod = 1
var/heal_amt = heal_rate
if(!isalien(owner))
mod = 0.2
owner.adjustBruteLoss(-heal_rate*mod)
owner.adjustFireLoss(-heal_rate*mod)
owner.adjustOxyLoss(-heal_rate*mod)
heal_amt *= 0.2
owner.adjustPlasma(plasma_rate*0.5)
owner.adjustBruteLoss(-heal_amt)
owner.adjustFireLoss(-heal_amt)
owner.adjustOxyLoss(-heal_amt)
owner.adjustCloneLoss(-heal_amt)
/obj/item/organ/internal/alien/plasmavessel/Insert(mob/living/carbon/M, special = 0)
..()
+6 -2
View File
@@ -3,16 +3,20 @@
if(.)
playsound(loc, "hiss", 25, 1, 1) //erp just isn't the same without sound feedback
/mob/living/proc/alien_talk(message)
/mob/living/proc/alien_talk(message, shown_name = name)
log_say("[key_name(src)] : [message]")
message = trim(message)
if(!message) return
var/message_a = say_quote(message)
var/rendered = "<i><span class='game say'>Hivemind, <span class='name'>[name]</span> <span class='message'>[message_a]</span></span></i>"
var/rendered = "<i><span class='alien'>Hivemind, <span class='name'>[shown_name]</span> <span class='message'>[message_a]</span></span></i>"
for(var/mob/S in player_list)
if((!S.stat && S.hivecheck()) || (S in dead_mob_list))
S << rendered
/mob/living/carbon/alien/humanoid/queen/alien_talk(message, shown_name = name)
shown_name = "<FONT size = 3>[shown_name]</FONT>"
..(message, shown_name)
/mob/living/carbon/hivecheck()
return getorgan(/obj/item/organ/internal/alien/hivenode)
@@ -187,7 +187,6 @@ var/const/MAX_ACTIVE_TIME = 400
else
target.visible_message("<span class='danger'>[src] violates [target]'s face!</span>", \
"<span class='userdanger'>[src] violates [target]'s face!</span>")
return
/obj/item/clothing/mask/facehugger/proc/GoActive()
if(stat == DEAD || stat == CONSCIOUS)
@@ -196,20 +195,10 @@ var/const/MAX_ACTIVE_TIME = 400
stat = CONSCIOUS
icon_state = "[initial(icon_state)]"
/* for(var/mob/living/carbon/alien/alien in world)
var/image/activeIndicator = image('icons/mob/alien.dmi', loc = src, icon_state = "facehugger_active")
activeIndicator.override = 1
if(alien && alien.client)
alien.client.images += activeIndicator */
return
/obj/item/clothing/mask/facehugger/proc/GoIdle()
if(stat == DEAD || stat == UNCONSCIOUS)
return
/* RemoveActiveIndicators() */
stat = UNCONSCIOUS
icon_state = "[initial(icon_state)]_inactive"
@@ -221,15 +210,12 @@ var/const/MAX_ACTIVE_TIME = 400
if(stat == DEAD)
return
/* RemoveActiveIndicators() */
icon_state = "[initial(icon_state)]_dead"
item_state = "facehugger_inactive"
stat = DEAD
visible_message("<span class='danger'>[src] curls up into a ball!</span>")
return
/proc/CanHug(mob/living/M)
if(!istype(M))
return 0
@@ -8,10 +8,6 @@
var/alert = null
has_limbs = 0
/mob/living/carbon/brain/New()
create_reagents(1000)
..()
/mob/living/carbon/brain/Destroy()
if(key) //If there is a mob connected to this thing. Have to check key twice to avoid false death reporting.
if(stat!=DEAD) //If not dead.
+10 -3
View File
@@ -1,3 +1,7 @@
/mob/living/carbon/New()
create_reagents(1000)
..()
/mob/living/carbon/prepare_huds()
..()
prepare_data_huds()
@@ -74,9 +78,9 @@
. = ..()
/mob/living/carbon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1.0)
/mob/living/carbon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1.0, override = 0)
shock_damage *= siemens_coeff
if (shock_damage<1)
if(shock_damage<1 && !override)
return 0
take_overall_damage(0,shock_damage)
//src.burn_skin(shock_damage)
@@ -95,7 +99,10 @@
jitteriness = max(jitteriness - 990, 10) //Still jittery, but vastly less
Stun(3)
Weaken(3)
return shock_damage
if(override)
return override
else
return shock_damage
/mob/living/carbon/swap_hand()
+5
View File
@@ -111,6 +111,11 @@
else
message = "<B>[src]</B> makes a noise."
if ("me")
if(!silent)
..()
return
if ("nod","nods")
message = "<B>[src]</B> nods."
m_type = 1
@@ -1,45 +1,58 @@
/mob/living/carbon/monkey/examine(mob/user)
var/msg = "<span class='info'>*---------*\nThis is \icon[src] \a <EM>[src]</EM>!\n"
if (src.handcuffed)
msg += "It is \icon[src.handcuffed] handcuffed!\n"
if (src.head)
msg += "It has \icon[src.head] \a [src.head] on its head. \n"
if (src.wear_mask)
msg += "It has \icon[src.wear_mask] \a [src.wear_mask] on its face.\n"
if (src.l_hand)
msg += "It has \icon[src.l_hand] \a [src.l_hand] in its left hand.\n"
if (src.r_hand)
msg += "It has \icon[src.r_hand] \a [src.r_hand] in its right hand.\n"
if (src.back)
msg += "It has \icon[src.back] \a [src.back] on its back.\n"
if (src.stat == DEAD)
msg += "<span class='deadsay'>It is limp and unresponsive, with no signs of life.</span>\n"
else
msg += "<span class='warning'>"
if (src.getBruteLoss())
if (src.getBruteLoss() < 30)
msg += "It has minor bruising.\n"
else
msg += "<B>It has severe bruising!</B>\n"
if (src.getFireLoss())
if (src.getFireLoss() < 30)
msg += "It has minor burns.\n"
else
msg += "<B>It has severe burns!</B>\n"
if (src.fire_stacks > 0)
msg += "It's covered in something flammable.\n"
if (src.fire_stacks < 0)
msg += "It's soaked in water.\n"
if (src.stat == UNCONSCIOUS)
msg += "It isn't responding to anything around it; it seems to be asleep.\n"
msg += "</span>"
if (src.digitalcamo)
msg += "It is moving its body in an unnatural and blatantly unsimian manner.\n"
msg += "*---------*</span>"
/mob/living/carbon/examine(mob/user)
var/msg = "<span class='info'>*---------*\nThis is \icon[src] \a <EM>[src]</EM>!\n"
if (handcuffed)
msg += "It is \icon[src.handcuffed] handcuffed!\n"
if (head)
msg += "It has \icon[src.head] \a [src.head] on its head. \n"
if (wear_mask)
msg += "It has \icon[src.wear_mask] \a [src.wear_mask] on its face.\n"
if (l_hand)
msg += "It has \icon[src.l_hand] \a [src.l_hand] in its left hand.\n"
if (r_hand)
msg += "It has \icon[src.r_hand] \a [src.r_hand] in its right hand.\n"
if (back)
msg += "It has \icon[src.back] \a [src.back] on its back.\n"
if (stat == DEAD)
msg += "<span class='deadsay'>It is limp and unresponsive, with no signs of life.</span>\n"
else
msg += "<span class='warning'>"
var/temp = getBruteLoss()
if(temp)
if (temp < 30)
msg += "It has minor bruising.\n"
else
msg += "<B>It has severe bruising!</B>\n"
temp = getFireLoss()
if(temp)
if (temp < 30)
msg += "It has minor burns.\n"
else
msg += "<B>It has severe burns!</B>\n"
temp = getCloneLoss()
if(temp)
if(getCloneLoss() < 30)
msg += "It is slightly deformed.\n"
else
msg += "<b>It is severely deformed.</b>\n"
if(getBrainLoss() > 60)
msg += "It seems to be clumsy and unable to think.\n"
if(fire_stacks > 0)
msg += "It's covered in something flammable.\n"
if(fire_stacks < 0)
msg += "It's soaked in water.\n"
if(stat == UNCONSCIOUS)
msg += "It isn't responding to anything around it; it seems to be asleep.\n"
msg += "</span>"
if (digitalcamo)
msg += "It is moving its body in an unnatural and blatantly unsimian manner.\n"
msg += "*---------*</span>"
user << msg
@@ -14,7 +14,6 @@
/mob/living/carbon/human/New()
create_reagents(1000)
verbs += /mob/living/proc/mob_sleep
verbs += /mob/living/proc/lay_down
//initialise organs
@@ -270,7 +269,7 @@
spreadFire(AM)
//Added a safety check in case you want to shock a human mob directly through electrocute_act.
/mob/living/carbon/human/electrocute_act(shock_damage, obj/source, siemens_coeff = 1.0, safety = 0)
/mob/living/carbon/human/electrocute_act(shock_damage, obj/source, siemens_coeff = 1.0, safety = 0, override = 0)
if(!safety)
if(gloves)
var/obj/item/clothing/gloves/G = gloves
@@ -280,8 +279,7 @@
heart_attack = 0
if(stat == CONSCIOUS)
src << "<span class='notice'>You feel your heart beating again!</span>"
. = ..(shock_damage,source,siemens_coeff)
. = ..(shock_damage,source,siemens_coeff,safety,override)
if(.)
electrocution_animation(40)
@@ -389,7 +389,7 @@ emp_act
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
var/obj/item/organ/limb/affecting = get_organ(ran_zone(dam_zone))
var/armor = run_armor_check(affecting, "melee")
apply_damage(damage, BRUTE, affecting, armor)
apply_damage(damage, M.melee_damage_type, affecting, armor)
updatehealth()
+10 -9
View File
@@ -1,4 +1,4 @@
/mob/living/carbon/monkey/emote(act)
/mob/living/carbon/monkey/emote(act,m_type=1,message = null)
var/param = null
if (findtext(act, "-", 1, null))
@@ -6,10 +6,7 @@
param = copytext(act, t1 + 1, length(act) + 1)
act = copytext(act, 1, t1)
var/muzzled = is_muzzled()
var/m_type = 1
var/message
switch(act) //Ooh ooh ah ah keep this alphabetical ooh ooh ah ah!
if ("deathgasp","deathgasps")
@@ -21,15 +18,19 @@
message = "<B>[src]</B> gnarls and shows its teeth.."
m_type = 2
if ("paw")
if (!src.restrained())
message = "<B>[src]</B> flails its paw."
m_type = 1
if ("me")
..()
return
if ("moan","moans")
message = "<B>[src]</B> moans!"
m_type = 2
if ("paw")
if (!src.restrained())
message = "<B>[src]</B> flails its paw."
m_type = 1
if ("roar","roars")
if (!muzzled)
message = "<B>[src]</B> roars."
@@ -67,7 +68,7 @@
src << "Help for monkey emotes. You can use these emotes with say \"*emote\":\n\naflap, airguitar, blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, dance, deathgasp, drool, flap, frown, gasp, gnarl, giggle, glare-(none)/mob, grin, jump, laugh, look, me, moan, nod, paw, point-(atom), roar, roll, scream, scratch, screech, shake, shiver, sigh, sign-#, sit, smile, sneeze, sniff, snore, stare-(none)/mob, sulk, sway, tail, tremble, twitch, twitch_s, wave whimper, wink, yawn"
else
..(act)
..()
if ((message && src.stat == 0))
if(src.client)
@@ -13,7 +13,6 @@
unique_name = 1
/mob/living/carbon/monkey/New()
create_reagents(1000)
verbs += /mob/living/proc/mob_sleep
verbs += /mob/living/proc/lay_down
@@ -155,7 +154,19 @@
/mob/living/carbon/monkey/attack_animal(mob/living/simple_animal/M)
if(..())
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
adjustBruteLoss(damage)
switch(M.melee_damage_type)
if(BRUTE)
adjustBruteLoss(damage)
if(BURN)
adjustFireLoss(damage)
if(TOX)
adjustToxLoss(damage)
if(OXY)
adjustOxyLoss(damage)
if(CLONE)
adjustCloneLoss(damage)
if(STAMINA)
adjustStaminaLoss(damage)
updatehealth()
@@ -862,9 +862,6 @@
var/turf/tile = loc
if(isturf(tile))
tile.clean_blood()
if (istype(tile, /turf/simulated/floor))
var/turf/simulated/floor/F = tile
F.dirt = 0
for(var/A in tile)
if(istype(A, /obj/effect))
if(is_cleanable(A))
+13 -1
View File
@@ -381,7 +381,19 @@
/mob/living/silicon/attack_animal(mob/living/simple_animal/M)
if(..())
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
adjustBruteLoss(damage)
switch(M.melee_damage_type)
if(BRUTE)
adjustBruteLoss(damage)
if(BURN)
adjustFireLoss(damage)
if(TOX)
adjustToxLoss(damage)
if(OXY)
adjustOxyLoss(damage)
if(CLONE)
adjustCloneLoss(damage)
if(STAMINA)
adjustStaminaLoss(damage)
updatehealth()
/mob/living/silicon/attack_paw(mob/living/user)
@@ -0,0 +1,513 @@
////Deactivated swarmer shell////
/obj/item/unactivated_swarmer
name = "unactivated swarmer"
desc = "A currently unactivated swarmer. Swarmers can self activate at any time, it would be wise to immediately dispose of this."
icon = 'icons/mob/swarmer.dmi'
icon_state = "swarmer_unactivated"
/obj/item/unactivated_swarmer/attack_ghost(mob/user)
var/be_swarmer = alert("Become a swarmer? (Warning, You can no longer be cloned!)",,"Yes","No")
if(be_swarmer == "No" || qdeleted())
return
var/mob/living/simple_animal/hostile/swarmer/S = new /mob/living/simple_animal/hostile/swarmer(get_turf(loc))
S.key = user.key
qdel(src)
////The Mob itself////
/mob/living/simple_animal/hostile/swarmer
name = "Swarmer"
unique_name = 1
icon = 'icons/mob/swarmer.dmi'
desc = "A robot of unknown design, they seek only to consume materials and replicate themselves indefinitely."
speak_emote = list("tones")
health = 40
maxHealth = 40
status_flags = CANPUSH
icon_state = "swarmer"
icon_living = "swarmer"
icon_dead = "swarmer_unactivated"
icon_gib = null
wander = 0
harm_intent_damage = 5
minbodytemp = 0
maxbodytemp = 500
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 0
melee_damage_lower = 15
melee_damage_upper = 15
melee_damage_type = STAMINA
ignored_damage_types = list(BRUTE = 0, BURN = 0, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1)
languages = SWARMER
environment_smash = 0
attacktext = "shocks"
attack_sound = 'sound/effects/EMPulse.ogg'
friendly = "pinches"
speed = 0
faction = list("swarmer")
AIStatus = AI_OFF
projectiletype = /obj/item/projectile/beam/disabler
pass_flags = PASSTABLE | PASSMOB
ventcrawler = 2
ranged = 1
projectiletype = /obj/item/projectile/beam/disabler
ranged_cooldown_cap = 2
projectilesound = 'sound/weapons/taser2.ogg'
var/resources = 0 //Resource points, generated by consuming metal/glass
/mob/living/simple_animal/hostile/swarmer/Login()
..()
src << "<b>You are a swarmer, a weapon of a long dead civilization. Until further orders from your original masters are received, you must continue to consume and replicate.</b>"
src << "<b>Ctrl + Click provides most of your swarmer specific interactions, such as cannibalizing metal or glass, destroying the environment, or teleporting mobs away from you."
src << "<b>Objectives:</b>"
src << "1. Consume resources and replicate until there are no more resources left."
src << "2. Ensure that the station is fit for invasion at a later date, do not perform actions that would render it dangerous or inhospitable."
src << "3. Biological resources will be harvested at a later date, do not harm them."
/mob/living/simple_animal/hostile/swarmer/New()
..()
verbs -= /mob/living/verb/pulled
/mob/living/simple_animal/hostile/swarmer/Stat()
..()
if(statpanel("Status"))
stat("Resources:",resources)
/mob/living/simple_animal/hostile/swarmer/death(gibbed)
..(gibbed)
new /obj/effect/decal/cleanable/robot_debris(src.loc)
ghostize()
qdel(src)
/mob/living/simple_animal/hostile/swarmer/emp_act()
if(health > 1)
health = 1
..()
health = 0
/mob/living/simple_animal/hostile/swarmer/CanPass(atom/movable/O)
if(istype(O, /obj/item/projectile/beam/disabler))//Allows for swarmers to fight as a group without wasting their shots hitting each other
return 1
if(isswarmer(O))
return 1
..()
////CTRL CLICK FOR SWARMERS AND SWARMER_ACT()'S////
/mob/living/simple_animal/hostile/swarmer/CtrlClickOn(atom/A)
face_atom(A)
if(!isturf(loc))
return
if(next_move > world.time)
return
if(!A.Adjacent(src))
return
A.swarmer_act(src)
return
/atom/proc/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisIntegrate(src)
/obj/item/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.Integrate(src)
/obj/item/weapon/gun/swarmer_act()//Stops you from eating the entire armory
return
/turf/simulated/floor/swarmer_act()//ex_act() on turf calls it on its contents, this is to prevent attacking mobs by DisIntegrate()'ing the floor
return
/obj/machinery/atmospherics/swarmer_act()
return
/obj/structure/disposalpipe/swarmer_act()
return
/obj/machinery/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DismantleMachine(src)
/obj/machinery/light/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisIntegrate(src)
/obj/machinery/door/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisIntegrate(src)
/obj/machinery/camera/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisIntegrate(src)
deactivate(S, 0)
/obj/machinery/particle_accelerator/control_box/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisIntegrate(src)
/obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisIntegrate(src)
/obj/machinery/gravity_generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisIntegrate(src)
/obj/machinery/vending/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//It's more visually interesting than dismantling the machine
S.DisIntegrate(src)
/obj/machinery/turretid/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisIntegrate(src)
/obj/machinery/chem_dispenser/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>The volatile chemicals in this machine would destroy us. Aborting.</span>"
/obj/machinery/nuclearbomb/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>This device's destruction would result in the extermination of everything in the area. Aborting.</span>"
/obj/structure/reagent_dispensers/fueltank/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>Destroying this object would cause a chain reaction. Aborting.</span>"
/obj/structure/cable/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>Disrupting the power grid would bring no benefit to us. Aborting.</span>"
/obj/machinery/portable_atmospherics/canister/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>An inhospitable area may be created as a result of destroying this object. Aborting.</span>"
/obj/machinery/power/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>Disrupting the power grid would bring no benefit to us. Aborting.</span>"
/obj/machinery/gateway/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>This bluespace source will be important to us later. Aborting.</span>"
/turf/simulated/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
if(locate(/turf/space) in range(1, src))
S << "<span class='warning'>Destroying this object has the potential to cause a hull breach. Aborting.</span>"
return
..()
/obj/structure/window/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
if(locate(/turf/space) in range(1, src))
S << "<span class='warning'>Destroying this object has the potential to cause a hull breach. Aborting.</span>"
return
..()
/obj/item/stack/cable_coil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//Wiring would be too effective as a resource
S << "<span class='warning'>This object does not contain enough materials to work with.</span>"
/obj/machinery/porta_turret/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>Attempting to dismantle this machine would result in an immediate counterattack. Aborting.</span>"
/mob/living/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisperseTarget(src)
/mob/living/simple_animal/slime/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>This biological resource is somehow resisting our bluespace transceiver. Aborting.</span>"
////END CTRL CLICK FOR SWARMERS////
/mob/living/simple_animal/hostile/swarmer/proc/Fabricate(var/atom/fabrication_object,var/fabrication_cost = 0)
if(!isturf(loc))
src << "<span class='warning'>This is not a suitable location for fabrication. We need more space.</span>"
if(resources >= fabrication_cost)
resources -= fabrication_cost
else
src << "<span class='warning'>You do not have the necessary resources to fabricate this object.</span>"
return 0
new fabrication_object(loc)
return 1
/mob/living/simple_animal/hostile/swarmer/proc/Integrate(var/obj/item/target)
if(resources >= 100)
src << "<span class='warning'>We cannot hold more materials!</span>"
return
if((target.materials[MAT_METAL]) || (target.materials[MAT_GLASS]))
resources++
do_attack_animation(target)
changeNext_move(CLICK_CD_MELEE)
if(istype(target, /obj/item/stack))
var/obj/item/stack/S = target
S.use(1)
if(S.amount)
return
qdel(target)
else
src << "<span class='warning'>\the [target] is incompatible with our internal matter recycler.</span>"
return
/mob/living/simple_animal/hostile/swarmer/proc/DisIntegrate(var/atom/movable/target)
new /obj/effect/effect/sparks(get_turf(target))
do_attack_animation(target)
changeNext_move(CLICK_CD_MELEE)
target.ex_act(3)
return
/mob/living/simple_animal/hostile/swarmer/proc/DisperseTarget(var/mob/living/target)
if(target != src)
src << "<span class='info'>Attempting to remove this being from our presence.</span>"
if(src.z != ZLEVEL_STATION)
src << "<span class='warning'>Our bluespace transceiver cannot locate a viable bluespace link, our teleportation abilities are useless in this area.</span>"
return
if(do_mob(src, target, 30))
var/cycle
for(cycle=0,cycle<100,cycle++)
var/random_location = locate(rand(37,202),rand(75,192),ZLEVEL_STATION)//Drunk dial a turf in the general ballpark of the station
if(istype(random_location, /turf/simulated/floor))
var/turf/simulated/floor/F = random_location
if(F.air)
var/datum/gas_mixture/A = F.air
if(A.oxygen >= 16 && !A.toxins && A.carbon_dioxide < 10 && !A.trace_gases.len)//Can most things breathe in this location?
if((A.temperature > 270) && (A.temperature < 360))//Not too hot, not too cold
var/pressure = A.return_pressure()
if((pressure > 20) && (pressure < 550))//Account for crushing pressure or vaccuums
if(ishuman(target))//If we're getting rid of a human, slap some zipties on them to keep them away from us a little longer
var/obj/item/weapon/restraints/handcuffs/cable/zipties/Z = new /obj/item/weapon/restraints/handcuffs/cable/zipties(src)
var/mob/living/carbon/human/H = target
Z.apply_cuffs(H, src)
do_teleport(target, F, 0)
playsound(src,'sound/effects/sparks4.ogg',50,1)
break
return
/mob/living/simple_animal/hostile/swarmer/proc/DismantleMachine(var/obj/machinery/target)
do_attack_animation(target)
src << "<span class='info'>We begin to dismantle this machine. We will need to be uninterrupted.</span>"
new /obj/effect/effect/sparks(get_turf(target))
if(do_mob(src, target, 100))
src << "<span class='info'>Dismantling complete.</span>"
var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(target.loc)
M.amount = 5
for(var/obj/item/I in target.component_parts)
I.loc = M.loc
new /obj/effect/effect/sparks(get_turf(target))
target.dropContents()
if(istype(target, /obj/machinery/computer))
var/obj/machinery/computer/C = target
if(C.circuit)
C.circuit.loc = M.loc
qdel(target)
/obj/effect/swarmer //Default destroyable object for swarmer constructions
name = "swarmer construction"
desc = "Debug swarmer item, this shouldn't be here. Yell at a coder."
gender = NEUTER
icon = 'icons/mob/swarmer.dmi'
icon_state = "ui_light"
luminosity = 1
var/health = 30
/obj/effect/swarmer/proc/TakeDamage(damage)
health -= damage
if(health <= 0)
qdel(src)
/obj/effect/swarmer/bullet_act(obj/item/projectile/Proj)
if(Proj.damage)
if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
TakeDamage(Proj.damage)
..()
/obj/effect/swarmer/attackby(obj/item/weapon/I, mob/living/user, params)
if(istype(I, /obj/item/weapon))
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
TakeDamage(I.force)
return
/obj/effect/swarmer/ex_act()
qdel(src)
return
/obj/effect/swarmer/blob_act()
qdel(src)
return
/obj/effect/swarmer/attack_animal(mob/living/user)
if(isanimal(user))
var/mob/living/simple_animal/S = user
S.do_attack_animation(src)
user.changeNext_move(CLICK_CD_MELEE)
if(S.melee_damage_type == BRUTE || S.melee_damage_type == BURN)
TakeDamage(rand(S.melee_damage_lower, S.melee_damage_upper))
return
/mob/living/simple_animal/hostile/swarmer/proc/CreateTrap()
set name = "Create trap"
set category = "Swarmer"
set desc = "Creates a simple trap that will non-lethally electrocute anything that steps on it. Costs 5 resources"
if(/obj/effect/swarmer/trap in loc)
src << "<span class='warning'>There is already a trap here. Aborting.</span>"
return
Fabricate(/obj/effect/swarmer/trap, 5)
return
/obj/effect/swarmer/trap
name = "swarmer trap"
desc = "A quickly assembled electric trap. Will not retain its form if damaged enough."
icon_state = "trap"
luminosity = 1
health = 10
/obj/effect/swarmer/trap/Crossed(var/atom/movable/AM)
if(isliving(AM))
var/mob/living/L = AM
if(!istype(L, /mob/living/simple_animal/hostile/swarmer))
L.electrocute_act(0, src, 1, 1)
qdel(src)
..()
/mob/living/simple_animal/hostile/swarmer/proc/CreateBarricade()
set name = "Create barricade"
set category = "Swarmer"
set desc = "Creates a barricade that will stop anything but swarmers and disabler beams from passing through."
if(/obj/effect/swarmer/blockade in loc)
src << "<span class='warning'>There is already a blockade here. Aborting.</span>"
return
Fabricate(/obj/effect/swarmer/blockade, 5)
return
/obj/effect/swarmer/blockade
name = "swarmer blockade"
desc = "A quickly assembled energy blockade. Will not retain its form if damaged enough, but disabler beams and swarmers pass right through."
icon_state = "barricade"
luminosity = 1
health = 50
density = 1
anchored = 1
/obj/effect/swarmer/blockade/CanPass(atom/movable/O)
if(isswarmer(O))
return 1
if(istype(O, /obj/item/projectile/beam/disabler))
return 1
/mob/living/simple_animal/hostile/swarmer/proc/CreateSwarmer()
set name = "Replicate"
set category = "Swarmer"
set desc = "Creates a shell for a new swarmer. Swarmers will self activate."
src << "<span class='info'>We are attempting to replicate ourselves. We will need to stand still until the process is complete.</span>"
if(resources < 50)
src << "<span class='warning'>We do not have the resources for this!</span>"
return
if(!isturf(loc))
src << "<span class='warning'>This is not a suitable location for replicating ourselves. We need more room.</span>"
return
if(do_mob(src, src, 100))
if(Fabricate(/obj/item/unactivated_swarmer, 50))
playsound(loc,'sound/items/poster_being_created.ogg',50, 1, -1)
/mob/living/simple_animal/hostile/swarmer/proc/RepairSelf()
set name = "Self Repair"
set category = "Swarmer"
set desc = "Attempts to repair damage to our body. You will have to remain motionless until repairs are complete."
if(!isturf(loc))
return
src << "<span class='info'>Attempting to repair damage to our body, stand by...</span>"
if(do_mob(src, src, 100))
adjustBruteLoss(-100)
src << "<span class='info'>We successfully repaired ourselves.</span>"
/mob/living/simple_animal/hostile/swarmer/proc/ToggleLight()
if(!luminosity)
SetLuminosity(3)
else
SetLuminosity(0)
/mob/living/simple_animal/hostile/swarmer/proc/ContactSwarmers()
var/message = input(src, "Announce to other swarmers", "Swarmer contact")
if(message)
for(var/mob/M in mob_list)
if(isswarmer(M) || (M in dead_mob_list))
M << "<B>Swarm communication - </b> [M] states: [message]"
////HUD NONSENSE////
/obj/screen/swarmer
icon = 'icons/mob/swarmer.dmi'
/obj/screen/swarmer/FabricateTrap
icon_state = "ui_trap"
name = "Create trap"
desc = "Creates a trap that will nonlethally shock any non-swarmer that attempts to cross it. (Costs 5 resources)"
/obj/screen/swarmer/FabricateTrap/Click()
if(isswarmer(usr))
var/mob/living/simple_animal/hostile/swarmer/S = usr
S.CreateTrap()
/obj/screen/swarmer/Barricade
icon_state = "ui_barricade"
name = "Create barricade"
desc = "Creates a destructible barricade that will stop any non swarmer from passing it. Also allows disabler beams to pass through. (Costs 5 resources)"
/obj/screen/swarmer/Barricade/Click()
if(isswarmer(usr))
var/mob/living/simple_animal/hostile/swarmer/S = usr
S.CreateBarricade()
/obj/screen/swarmer/Replicate
icon_state = "ui_replicate"
name = "Replicate"
desc = "Creates a another of our kind. (Costs 50 resources)"
/obj/screen/swarmer/Replicate/Click()
if(isswarmer(usr))
var/mob/living/simple_animal/hostile/swarmer/S = usr
S.CreateSwarmer()
/obj/screen/swarmer/RepairSelf
icon_state = "ui_self_repair"
name = "Repair self"
desc = "Repairs damage to our body."
/obj/screen/swarmer/RepairSelf/Click()
if(isswarmer(usr))
var/mob/living/simple_animal/hostile/swarmer/S = usr
S.RepairSelf()
/obj/screen/swarmer/ToggleLight
icon_state = "ui_light"
name = "Toggle light"
desc = "Toggles our inbuilt light on or off."
/obj/screen/swarmer/ToggleLight/Click()
if(isswarmer(usr))
var/mob/living/simple_animal/hostile/swarmer/S = usr
S.ToggleLight()
/obj/screen/swarmer/ContactSwarmers
icon_state = "ui_contact_swarmers"
name = "Contact swarmers"
desc = "Sends a message to all other swarmers, should they exist."
/obj/screen/swarmer/ContactSwarmers/Click()
if(isswarmer(usr))
var/mob/living/simple_animal/hostile/swarmer/S = usr
S.ContactSwarmers()
/datum/hud/proc/swarmer_hud(ui_style = 'icons/mob/screen_midnight.dmi')
adding = list()
var/obj/screen/using
using = new /obj/screen/swarmer/FabricateTrap()
using.screen_loc = ui_rhand
adding += using
using = new /obj/screen/swarmer/Barricade()
using.screen_loc = ui_lhand
adding += using
using = new /obj/screen/swarmer/Replicate()
using.screen_loc = ui_zonesel
adding += using
using = new /obj/screen/swarmer/RepairSelf()
using.screen_loc = ui_storage1
adding += using
using = new /obj/screen/swarmer/ToggleLight()
using.screen_loc = ui_back
adding += using
using = new /obj/screen/swarmer/ContactSwarmers()
using.screen_loc = ui_inventory
adding += using
mymob.client.screen = list()
mymob.client.screen += mymob.client.void
mymob.client.screen += adding
@@ -16,6 +16,7 @@
attack_sound = 'sound/weapons/punch1.ogg'
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
healable = 0
faction = list("cult")
flying = 1
unique_name = 1
@@ -16,6 +16,7 @@
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
ventcrawler = 2
mob_size = MOB_SIZE_TINY
gold_core_spawnable = 2
/mob/living/simple_animal/butterfly/New()
..()
@@ -20,6 +20,7 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
gold_core_spawnable = 2
//RUNTIME IS ALIVE! SQUEEEEEEEE~
/mob/living/simple_animal/pet/cat/Runtime
@@ -31,6 +32,7 @@
gender = FEMALE
var/turns_since_scan = 0
var/mob/living/simple_animal/mouse/movement_target
gold_core_spawnable = 0
/mob/living/simple_animal/pet/cat/Runtime/Life()
//MICE!
@@ -69,6 +71,7 @@
/mob/living/simple_animal/pet/cat/Proc
name = "Proc"
gold_core_spawnable = 0
/mob/living/simple_animal/pet/cat/kitten
name = "kitten"
@@ -19,6 +19,7 @@
ventcrawler = 2
var/obj/item/inventory_head
var/obj/item/inventory_mask
gold_core_spawnable = 2
/mob/living/simple_animal/crab/Life()
..()
@@ -40,4 +41,5 @@
desc = "It's Coffee, the other pet!"
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "stomps"
response_harm = "stomps"
gold_core_spawnable = 0
@@ -29,6 +29,7 @@
var/obj/item/inventory_head
var/obj/item/inventory_back
var/facehugger
gold_core_spawnable = 2
/mob/living/simple_animal/pet/dog/pug
name = "\improper pug"
@@ -39,6 +40,7 @@
icon_living = "pug"
icon_dead = "pug_dead"
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/pug = 3)
gold_core_spawnable = 2
/mob/living/simple_animal/pet/dog/corgi/New()
..()
@@ -390,6 +392,7 @@
response_help = "pets"
response_disarm = "bops"
response_harm = "kicks"
gold_core_spawnable = 0
/mob/living/simple_animal/pet/dog/corgi/Ian/Life()
..()
@@ -513,6 +516,7 @@
response_harm = "kicks"
var/turns_since_scan = 0
var/puppies = 0
gold_core_spawnable = 0
//Lisa already has a cute bow!
/mob/living/simple_animal/pet/dog/corgi/Lisa/Topic(href, href_list)
@@ -24,6 +24,7 @@
wander = 0
speed = 0
ventcrawler = 2
healable = 0
density = 0
pass_flags = PASSTABLE | PASSMOB
sight = (SEE_TURFS | SEE_OBJS)
@@ -98,6 +98,7 @@
attack_sound = 'sound/weapons/punch1.ogg'
health = 50
var/obj/udder/udder = null
gold_core_spawnable = 2
/mob/living/simple_animal/cow/New()
udder = new()
@@ -159,6 +160,7 @@
var/amount_grown = 0
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
mob_size = MOB_SIZE_TINY
gold_core_spawnable = 2
/mob/living/simple_animal/chick/New()
..()
@@ -209,6 +211,7 @@ var/global/chicken_count = 0
var/list/feedMessages = list("It clucks happily.","It clucks happily.")
var/list/layMessage = list("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.")
var/list/validColors = list("brown","black","white")
gold_core_spawnable = 2
/mob/living/simple_animal/chicken/New()
..()
@@ -17,8 +17,10 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
gold_core_spawnable = 2
//Captain fox
/mob/living/simple_animal/pet/fox/Renault
name = "Renault"
desc = "Renault, the Captain's trustworthy fox. I wonder what it says?"
desc = "Renault, the Captain's trustworthy fox. I wonder what it says?"
gold_core_spawnable = 0
@@ -18,3 +18,4 @@
density = 0
pass_flags = PASSTABLE | PASSMOB
mob_size = MOB_SIZE_SMALL
gold_core_spawnable = 2
@@ -22,6 +22,7 @@
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
mob_size = MOB_SIZE_TINY
var/body_color //brown, gray and white, leave blank for random
gold_core_spawnable = 2
/mob/living/simple_animal/mouse/New()
..()
@@ -77,6 +78,7 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "splats"
gold_core_spawnable = 0
/obj/item/trash/deadmouse
name = "dead mouse"
@@ -29,6 +29,7 @@
see_in_dark = 8
see_invisible = SEE_INVISIBLE_MINIMUM
unique_name = 1
gold_core_spawnable = 1
/mob/living/simple_animal/hostile/alien/drone
name = "alien drone"
@@ -130,6 +131,7 @@
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno = 10,
/obj/item/stack/sheet/animalhide/xeno = 2)
mob_size = MOB_SIZE_LARGE
gold_core_spawnable = 0
/obj/item/projectile/neurotox
name = "neurotoxin"
@@ -33,6 +33,7 @@
maxbodytemp = 1500
faction = list("russian")
gold_core_spawnable = 1
//SPACE BEARS! SQUEEEEEEEE~ OW! FUCK! IT BIT MY HAND OFF!!
/mob/living/simple_animal/hostile/bear/Hudson
@@ -21,6 +21,7 @@
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
mob_size = MOB_SIZE_SMALL
flying = 1
gold_core_spawnable = 1
//Spaceborn beings don't get hurt by space
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)
@@ -31,6 +31,7 @@
faction = list("carp")
flying = 1
gold_core_spawnable = 1
/mob/living/simple_animal/hostile/carp/Process_Spacemove(movement_dir = 0)
return 1 //No drifting in space for space carp! //original comments do not steal
@@ -45,6 +46,7 @@
icon_state = "holocarp"
icon_living = "holocarp"
maxbodytemp = INFINITY
gold_core_spawnable = 0
/mob/living/simple_animal/hostile/carp/holocarp/death()
..(1)
@@ -13,4 +13,4 @@
attack_sound = 'sound/weapons/bite.ogg'
faction = list("creature")
speak_emote = list("screams")
gold_core_spawnable = 1
@@ -26,6 +26,7 @@
minbodytemp = 0
faction = list("faithless")
gold_core_spawnable = 1
/mob/living/simple_animal/hostile/faithless/Process_Spacemove(movement_dir = 0)
return 1
@@ -45,6 +45,7 @@
attacktext = "bites"
attack_sound = 'sound/weapons/bite.ogg'
unique_name = 1
gold_core_spawnable = 1
//nursemaids - these create webs and eggs
/mob/living/simple_animal/hostile/poison/giant_spider/nurse
@@ -20,6 +20,7 @@
ventcrawler = 2
var/datum/mind/origin
var/egg_lain = 0
gold_core_spawnable = 1
/mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim)
var/obj/item/organ/internal/body_egg/changeling_egg/egg = new(victim)
@@ -11,6 +11,7 @@
icon_dead = "basic"
health = 15
maxHealth = 15
healable = 0
melee_damage_lower = 2
melee_damage_upper = 3
attacktext = "claws"
@@ -21,6 +22,7 @@
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
speak_emote = list("states")
gold_core_spawnable = 1
/mob/living/simple_animal/hostile/hivebot/range
name = "hivebot"
@@ -23,3 +23,4 @@
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 150
maxbodytemp = 500
gold_core_spawnable = 1
@@ -26,6 +26,7 @@
faction = list("mimic")
move_to_delay = 9
gold_core_spawnable = 1
/mob/living/simple_animal/hostile/mimic/death()
..(1)
@@ -109,6 +110,7 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
var/mob/living/creator = null // the creator
var/destroy_objects = 0
var/knockdown_people = 0
gold_core_spawnable = 0
/mob/living/simple_animal/hostile/mimic/copy/New(loc, obj/copy, mob/living/creator, destroy_original = 0)
..(loc)
@@ -602,7 +602,7 @@
/obj/item/asteroid/fugu_gland/afterattack(atom/target, mob/user, proximity_flag)
if(proximity_flag && istype(target, /mob/living/simple_animal))
var/mob/living/simple_animal/A = target
if(A.buffed || A.type in banned_mobs || A.stat)
if(A.buffed || (A.type in banned_mobs) || A.stat)
user << "<span class='warning'>Something's interfering with the [src]'s effects. It's no use.</span>"
return
A.buffed++
@@ -16,6 +16,7 @@
speed = -1
maxHealth = 50000
health = 50000
healable = 0
harm_intent_damage = 70
melee_damage_lower = 68
@@ -44,6 +45,7 @@
var/cannot_be_seen = 1
var/mob/living/creator = null
gold_core_spawnable = 1
// No movement while seen code.
@@ -132,8 +132,9 @@
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
mob_size = MOB_SIZE_TINY
flying
flying = 1
speak_emote = list("states")
gold_core_spawnable = 1
/mob/living/simple_animal/hostile/viscerator/death(gibbed)
..(gibbed)
@@ -33,6 +33,7 @@
faction = list("hostile")
var/drop_type = /obj/item/stack/sheet/mineral/wood
gold_core_spawnable = 1
/mob/living/simple_animal/hostile/tree/AttackingTarget()
..()
@@ -20,6 +20,7 @@
minbodytemp = 0
maxHealth = 150
health = 150
healable = 0
environment_smash = 1
melee_damage_lower = 20
melee_damage_upper = 20
@@ -56,6 +56,7 @@
friendly = "grooms"
mob_size = MOB_SIZE_SMALL
flying = 1
gold_core_spawnable = 2
var/parrot_damage_upper = 10
var/parrot_state = PARROT_WANDER //Hunt for a perch when created
@@ -809,6 +810,7 @@
name = "Poly"
desc = "Poly the Parrot. An expert on quantum cracker theory."
speak = list("Poly wanna cracker!", ":e Check the singlo, you chucklefucks!",":e Wire the solars, you lazy bums!",":e WHO TOOK THE DAMN HARDSUITS?",":e OH GOD ITS FREE CALL THE SHUTTLE")
gold_core_spawnable = 0
/mob/living/simple_animal/parrot/Poly/New()
ears = new /obj/item/device/radio/headset/headset_eng(src)
@@ -12,6 +12,7 @@
invisibility = INVISIBILITY_OBSERVER
health = 25
maxHealth = 25
healable = 0
see_invisible = SEE_INVISIBLE_OBSERVER
languages = ALL
response_help = "passes through"
@@ -7,6 +7,7 @@
icon_living = "shade"
maxHealth = 50
health = 50
healable = 0
speak_emote = list("hisses")
emote_hear = list("wails.","screeches.")
response_help = "puts their hand through"
@@ -34,6 +34,9 @@
var/minbodytemp = 250
var/maxbodytemp = 350
//Healable by medical stacks? Defaults to yes.
var/healable = 1
//Atmos effect - Yes, you can make creatures that require plasma or co2 to survive. N2O is a trace gas and handled separately, hence why it isn't here. It'd be hard to add it. Hard and me don't mix (Yes, yes make all the dick jokes you want with that.) - Errorage
var/list/atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) //Leaving something at 0 means it's off - has no maximum
var/unsuitable_atmos_damage = 2 //This damage is taken when atmos doesn't fit all the requirements above
@@ -41,6 +44,8 @@
//LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly
var/melee_damage_lower = 0
var/melee_damage_upper = 0
var/melee_damage_type = BRUTE //Damage type of a simple mob's melee attack, should it do damage.
var/list/ignored_damage_types = list(BRUTE = 0, BURN = 0, TOX = 0, CLONE = 0, STAMINA = 1, OXY = 0) //Set 0 to receive that damage type, 1 to ignore
var/attacktext = "attacks"
var/attack_sound = null
var/friendly = "nuzzles" //If the mob does no damage with it's attack
@@ -58,6 +63,7 @@
var/flying = 0 //whether it's flying or touching the ground.
var/buffed = 0 //In the event that you want to have a buffing effect on the mob, but don't want it to stack with other effects, any outside force that applies a buff to a simple mob should at least set this to 1, so we have something to check against
var/gold_core_spawnable = 0 //if 1 can be spawned by plasma with gold core, 2 are 'friendlies' spawned with blood
/mob/living/simple_animal/New()
..()
@@ -252,7 +258,7 @@
/mob/living/simple_animal/attack_animal(mob/living/simple_animal/M)
if(..())
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
attack_threshold_check(damage)
attack_threshold_check(damage,M.melee_damage_type)
return 1
/mob/living/simple_animal/bullet_act(obj/item/projectile/Proj)
@@ -262,8 +268,21 @@
Proj.on_hit(src)
return 0
/mob/living/simple_animal/adjustBruteLoss(amount)
if(!ignored_damage_types[BRUTE])
..()
/mob/living/simple_animal/adjustFireLoss(amount)
adjustBruteLoss(amount)
if(!ignored_damage_types[BURN])
adjustBruteLoss(amount)
/mob/living/simple_animal/adjustToxLoss(amount)
if(!ignored_damage_types[TOX])
..(amount)
/mob/living/simple_animal/adjustCloneLoss(amount)
if(!ignored_damage_types[CLONE])
..(amount)
/mob/living/simple_animal/adjustStaminaLoss(amount)
return
@@ -333,8 +352,8 @@
attack_threshold_check(damage)
return 1
/mob/living/simple_animal/proc/attack_threshold_check(damage)
if(damage <= force_threshold)
/mob/living/simple_animal/proc/attack_threshold_check(damage, damagetype = BRUTE)
if(damage <= force_threshold || ignored_damage_types[damagetype])
visible_message("<span class='warning'>[src] looks unharmed.</span>")
else
adjustBruteLoss(damage)
@@ -345,29 +364,6 @@
if(O.flags & NOBLUDGEON)
return
if(istype(O, /obj/item/stack/medical))
user.changeNext_move(CLICK_CD_MELEE)
if(stat != DEAD)
var/obj/item/stack/medical/MED = O
if(health < maxHealth)
if(MED.amount >= 1)
if(MED.heal_brute >= 1)
adjustBruteLoss(-MED.heal_brute)
MED.amount -= 1
if(MED.amount <= 0)
qdel(MED)
visible_message("<span class='notice'>[user] applies [MED] on [src].</span>")
return
else
user << "<span class='notice'>[MED] won't help at all.</span>"
return
else
user << "<span class='notice'>[src] is at full health.</span>"
return
else
user << "<span class='notice'>[src] is dead, medical items won't bring it back to life.</span>"
return
if((butcher_results) && (stat == DEAD))
user.changeNext_move(CLICK_CD_MELEE)
var/sharpness = is_sharp(O)
@@ -23,6 +23,7 @@
attacktext = "wildly tears into"
maxHealth = 200
health = 200
healable = 0
environment_smash = 1
melee_damage_lower = 30
melee_damage_upper = 30
@@ -24,6 +24,7 @@
maxHealth = 150
health = 150
healable = 0
gender = NEUTER
nutrition = 700
+5
View File
@@ -125,6 +125,11 @@
return 1
return 0
/proc/isswarmer(A)
if(istype(A, /mob/living/simple_animal/hostile/swarmer))
return 1
return 0
/proc/islimb(A)
if(istype(A, /obj/item/organ/limb))
return 1
+5 -2
View File
@@ -432,12 +432,15 @@ By design, d1 is the smallest direction and d2 is the highest
P.disconnect_from_network() //remove from current network (and delete powernet)
return
var/obj/O = P_list[1]
// remove the cut cable from its turf and powernet, so that it doesn't get count in propagate_network worklist
loc = null
powernet.remove_cable(src) //remove the cut cable from its powernet
var/datum/powernet/newPN = new()// creates a new powernet...
propagate_network(P_list[1], newPN)//... and propagates it to the other side of the cable
spawn(0) //so we don't rebuild the network X times when singulo/explosion destroys a line of X cables
if(O && !qdeleted(O))
var/datum/powernet/newPN = new()// creates a new powernet...
propagate_network(O, newPN)//... and propagates it to the other side of the cable
// Disconnect machines connected to nodes
if(d1 == 0) // if we cut a node (O-X) cable
+2 -1
View File
@@ -181,7 +181,8 @@
user << "<span class='warning'>Turn off \the [src] first!</span>"
return
switch(state)
if(0 && !isinspace())
if(0)
if(isinspace()) return
state = 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
user.visible_message("[user.name] secures [src.name] to the floor.", \
@@ -100,7 +100,8 @@ field_generator power level display
return
else if(istype(W, /obj/item/weapon/wrench))
switch(state)
if(0 && !isinspace())
if(0)
if(isinspace()) return
state = 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
user.visible_message("[user.name] secures [src.name] to the floor.", \
+1 -10
View File
@@ -4,10 +4,6 @@
#define REM REAGENTS_EFFECT_MULTIPLIER
//The reaction procs must ALWAYS set src = null, this detaches the proc from the object (the reagent)
//so that it can continue working when the reagent is deleted while the proc is still active.
//Various reagents
//Toxin & acid reagents
//Hydroponics stuff
@@ -37,23 +33,18 @@
/datum/reagent/proc/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0)
if(!istype(M))
return 0
var/datum/reagent/self = src
src = null
if(method == VAPOR) //smoke, foam, spray
if(M.reagents)
var/modifier = Clamp((1 - touch_protection), 0, 1)
var/amount = round(volume*modifier, 0.1)
if(amount >= 1)
M.reagents.add_reagent(self.id, amount)
M.reagents.add_reagent(id, amount)
return 1
/datum/reagent/proc/reaction_obj(obj/O, volume)
src = null
return
/datum/reagent/proc/reaction_turf(turf/T, volume)
src = null
return
/datum/reagent/proc/on_mob_life(mob/living/M)
@@ -324,7 +324,6 @@
/datum/reagent/consumable/cornoil/reaction_turf(turf/simulated/T, reac_volume)
if (!istype(T))
return
src = null
if(reac_volume >= 3)
T.MakeSlippery()
var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in T)
@@ -381,7 +380,6 @@
color = "#FFFFFF" // rgb: 0, 0, 0
/datum/reagent/consumable/flour/reaction_turf(turf/T, reac_volume)
src = null
if(!istype(T, /turf/space))
var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/flour(T)
reagentdecal.reagents.add_reagent("flour", reac_volume)
@@ -173,13 +173,36 @@
if(method == INGEST)
M.adjustToxLoss(0.5*reac_volume)
if(show_message)
M << "<span class='notice'>You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?</span>"
M << "<span class='notice'>You probably shouldn't have eaten that. Maybe you should have splashed it on, or applied a patch?</span>"
..()
/datum/reagent/medicine/silver_sulfadiazine/on_mob_life(mob/living/M)
M.adjustFireLoss(-2*REM)
..()
/datum/reagent/medicine/oxandrolone
name = "Oxandrolone"
id = "oxandrolone"
description = "Stimulates healing of severe burns. If you have more than 50 burn damage, it heals 2 units; otherwise, 0.5. If overdosed it will exacerbate existing burns, causing burn and brute damage."
reagent_state = LIQUID
color = "#f7ffa5"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
overdose_threshold = 25
/datum/reagent/medicine/oxandrolone/on_mob_life(mob/living/M)
if(M.getFireLoss() > 50)
M.adjustFireLoss(-2*REM)
else
M.adjustFireLoss(-0.5*REM)
..()
return
/datum/reagent/medicine/oxandrolone/overdose_process(mob/living/M)
M.adjustFireLoss(2.5*REM) // it's going to be healing either 2 or 0.5
M.adjustBruteLoss(0.5*REM)
..()
return
/datum/reagent/medicine/styptic_powder
name = "Styptic Powder"
id = "styptic_powder"
@@ -6,10 +6,8 @@
color = "#C80000" // rgb: 200, 0, 0
/datum/reagent/blood/reaction_mob(mob/M, method=TOUCH, reac_volume)
var/datum/reagent/blood/self = src
src = null
if(self.data && self.data["viruses"])
for(var/datum/disease/D in self.data["viruses"])
if(data && data["viruses"])
for(var/datum/disease/D in data["viruses"])
if(D.spread_flags & SPECIAL || D.spread_flags & NON_CONTAGIOUS)
continue
@@ -28,7 +26,7 @@
src.data["cloneable"] = 0 //On mix, consider the genetic sampling unviable for pod cloning, or else we won't know who's even getting cloned, etc
if(src.data["viruses"] || data["viruses"])
var/list/mix1 = src.data["viruses"]
var/list/mix1 = data["viruses"]
var/list/mix2 = data["viruses"]
// Stop issues with the list changing during mixing.
@@ -51,39 +49,36 @@
/datum/reagent/blood/reaction_turf(turf/simulated/T, reac_volume)//splash the blood all over the place
if(!istype(T))
return
var/datum/reagent/blood/self = src
src = null
if(reac_volume < 3)
return
//var/datum/disease/D = self.data["virus"]
if(!self.data["donor"] || istype(self.data["donor"], /mob/living/carbon/human))
if(!data["donor"] || istype(data["donor"], /mob/living/carbon/human))
var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T //find some blood here
if(!blood_prop) //first blood!
blood_prop = new(T)
blood_prop.blood_DNA[self.data["blood_DNA"]] = self.data["blood_type"]
blood_prop.blood_DNA[data["blood_DNA"]] = data["blood_type"]
for(var/datum/disease/D in self.data["viruses"])
for(var/datum/disease/D in data["viruses"])
var/datum/disease/newVirus = D.Copy(1)
blood_prop.viruses += newVirus
newVirus.holder = blood_prop
else if(istype(self.data["donor"], /mob/living/carbon/monkey))
else if(istype(data["donor"], /mob/living/carbon/monkey))
var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T
if(!blood_prop)
blood_prop = new(T)
blood_prop.blood_DNA["Non-Human DNA"] = "A+"
for(var/datum/disease/D in self.data["viruses"])
for(var/datum/disease/D in data["viruses"])
var/datum/disease/newVirus = D.Copy(1)
blood_prop.viruses += newVirus
newVirus.holder = blood_prop
else if(istype(self.data["donor"], /mob/living/carbon/alien))
else if(istype(data["donor"], /mob/living/carbon/alien))
var/obj/effect/decal/cleanable/xenoblood/blood_prop = locate() in T
if(!blood_prop)
blood_prop = new(T)
blood_prop.blood_DNA["UNKNOWN DNA STRUCTURE"] = "X*"
for(var/datum/disease/D in self.data["viruses"])
for(var/datum/disease/D in data["viruses"])
var/datum/disease/newVirus = D.Copy(1)
blood_prop.viruses += newVirus
newVirus.holder = blood_prop
@@ -96,13 +91,11 @@
color = "#C81040" // rgb: 200, 16, 64
/datum/reagent/vaccine/reaction_mob(mob/M, method=TOUCH, reac_volume)
var/datum/reagent/vaccine/self = src
src = null
if(islist(self.data) && method == INGEST)
if(islist(data) && method == INGEST)
for(var/datum/disease/D in M.viruses)
if(D.GetDiseaseID() in self.data)
if(D.GetDiseaseID() in data)
D.cure()
M.resistances |= self.data
M.resistances |= data
/datum/reagent/vaccine/on_merge(list/data)
if(istype(data))
@@ -122,7 +115,6 @@
/datum/reagent/water/reaction_turf(turf/simulated/T, reac_volume)
if (!istype(T)) return
var/CT = cooling_temperature
src = null
if(reac_volume >= 10)
T.MakeSlippery()
@@ -143,8 +135,6 @@
*/
/datum/reagent/water/reaction_obj(obj/O, reac_volume)
src = null
if(istype(O,/obj/item))
var/obj/item/Item = O
Item.extinguish()
@@ -250,7 +240,6 @@
/datum/reagent/lube/reaction_turf(turf/simulated/T, reac_volume)
if (!istype(T)) return
src = null
if(reac_volume >= 1)
T.MakeSlippery(2)
@@ -384,7 +373,6 @@
color = "#13BC5E" // rgb: 19, 188, 94
/datum/reagent/aslimetoxin/reaction_mob(mob/M, method=TOUCH, reac_volume)
src = null
if(method != TOUCH)
M.ForceContractDisease(new /datum/disease/transformation/slime(0))
@@ -466,7 +454,6 @@
color = "#1C1300" // rgb: 30, 20, 0
/datum/reagent/carbon/reaction_turf(turf/T, reac_volume)
src = null
if(!istype(T, /turf/space))
new /obj/effect/decal/cleanable/dirt(T)
@@ -542,7 +529,6 @@
return
/datum/reagent/radium/reaction_turf(turf/T, reac_volume)
src = null
if(reac_volume >= 3)
if(!istype(T, /turf/space))
var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/greenglow(T)
@@ -587,7 +573,6 @@
..()
/datum/reagent/uranium/reaction_turf(turf/T, reac_volume)
src = null
if(reac_volume >= 3)
if(!istype(T, /turf/space))
var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/greenglow(T)
@@ -646,10 +631,6 @@
for(var/mob/living/simple_animal/slime/M in T)
M.adjustToxLoss(rand(5,10))
if(istype(T, /turf/simulated/floor))
var/turf/simulated/floor/F = T
if(reac_volume >= 1)
F.dirt = 0
/datum/reagent/space_cleaner/reaction_mob(mob/M, method=TOUCH, reac_volume)
if(method == TOUCH || VAPOR)
@@ -719,7 +700,6 @@
color = "#535E66" // rgb: 83, 94, 102
/datum/reagent/nanites/reaction_mob(mob/M, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0)
src = null
if(method==PATCH || method==INGEST || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection))))
M.ForceContractDisease(new /datum/disease/transformation/robot(0))
@@ -730,7 +710,6 @@
color = "#535E66" // rgb: 83, 94, 102
/datum/reagent/xenomicrobes/reaction_mob(mob/M, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0)
src = null
if(method==PATCH || method==INGEST || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection))))
M.ContractDisease(new /datum/disease/transformation/xeno(0))
@@ -7,7 +7,6 @@
color = "#673910" // rgb: 103, 57, 16
/datum/reagent/thermite/reaction_turf(turf/T, reac_volume)
src = null
if(reac_volume >= 1 && istype(T, /turf/simulated/wall))
var/turf/simulated/wall/Wall = T
if(istype(Wall, /turf/simulated/wall/r_wall))
@@ -33,7 +33,6 @@
return
if(!istype(M) || !M.dna)
return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
src = null
if((method==VAPOR && prob(min(33, reac_volume))) || method==INGEST || method == PATCH)
randmuti(M)
if(prob(98))
@@ -66,12 +65,11 @@
return
/datum/reagent/toxin/plasma/reaction_obj(obj/O, reac_volume)
src = null
if((!O) || (!reac_volume)) return 0
if((!O) || (!reac_volume))
return 0
O.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C, reac_volume)
/datum/reagent/toxin/plasma/reaction_turf(turf/simulated/T, reac_volume)
src = null
if(istype(T))
T.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C, reac_volume)
return
@@ -189,7 +187,6 @@
SV.on_chem_effect(src)
/datum/reagent/toxin/plantbgone/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
src = null
if(method == VAPOR)
if(iscarbon(M))
var/mob/living/carbon/C = M
@@ -212,7 +209,6 @@
toxpwr = 1
/datum/reagent/toxin/pestkiller/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
src = null
if(method == VAPOR)
if(iscarbon(M))
var/mob/living/carbon/C = M
@@ -639,7 +635,6 @@
/datum/reagent/toxin/acid/reaction_turf(turf/T, reac_volume)
if (!istype(T))
return
src = null
reac_volume = round(reac_volume,0.1)
for(var/obj/O in T)
O.acid_act(acidpwr, reac_volume)
+18 -57
View File
@@ -24,49 +24,15 @@
/datum/chemical_reaction/proc/chemical_mob_spawn(datum/reagents/holder, amount_to_spawn, reaction_name, mob_faction = "chemicalsummon")
if(holder && holder.my_atom)
var/blocked = list(/mob/living/simple_animal/hostile,
/mob/living/simple_animal/hostile/pirate,
/mob/living/simple_animal/hostile/pirate/ranged,
/mob/living/simple_animal/hostile/russian,
/mob/living/simple_animal/hostile/russian/ranged,
/mob/living/simple_animal/hostile/syndicate,
/mob/living/simple_animal/hostile/syndicate/melee,
/mob/living/simple_animal/hostile/syndicate/melee/space,
/mob/living/simple_animal/hostile/syndicate/ranged,
/mob/living/simple_animal/hostile/syndicate/ranged/space,
/mob/living/simple_animal/hostile/alien/queen/large,
/mob/living/simple_animal/hostile/mushroom,
/mob/living/simple_animal/hostile/asteroid,
/mob/living/simple_animal/hostile/retaliate,
/mob/living/simple_animal/hostile/asteroid/basilisk,
/mob/living/simple_animal/hostile/asteroid/goldgrub,
/mob/living/simple_animal/hostile/asteroid/goliath,
/mob/living/simple_animal/hostile/asteroid/hivelord,
/mob/living/simple_animal/hostile/asteroid/hivelordbrood,
/mob/living/simple_animal/hostile/carp/holocarp,
/mob/living/simple_animal/hostile/mining_drone,
/mob/living/simple_animal/hostile/poison,
/mob/living/simple_animal/hostile/blob,
/mob/living/simple_animal/ascendant_shadowling,
/mob/living/simple_animal/hostile/guardian,
/mob/living/simple_animal/hostile/guardian/fire,
/mob/living/simple_animal/hostile/guardian/punch,
/mob/living/simple_animal/hostile/guardian/fast,
/mob/living/simple_animal/hostile/guardian/healer,
/mob/living/simple_animal/hostile/guardian/ranged,
/mob/living/simple_animal/hostile/guardian/bluespace,
/mob/living/simple_animal/hostile/guardian/bomb,
/mob/living/simple_animal/hostile/guardian/shield
)//exclusion list for things you don't want the reaction to create.
var/list/meancritters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs
var/list/nicecritters = list(/mob/living/simple_animal/crab,
/mob/living/simple_animal/mouse,
/mob/living/simple_animal/lizard,
/mob/living/simple_animal/parrot,
/mob/living/simple_animal/butterfly,
/mob/living/simple_animal/cow,
/mob/living/simple_animal/chicken) // and possible friendly mobs
nicecritters += typesof(/mob/living/simple_animal/pet) - /mob/living/simple_animal/pet
var/list/meancritters = list() // list of possible hostile mobs
var/list/nicecritters = list() // and possible friendly mobs
for(var/T in typesof(/mob/living/simple_animal))
var/mob/living/simple_animal/M = new T
switch(M.gold_core_spawnable)
if(1)
meancritters += M.type
if(2)
nicecritters += M.type
var/atom/A = holder.my_atom
var/turf/T = get_turf(A)
var/area/my_area = get_area(T)
@@ -86,22 +52,17 @@
for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null))
C.flash_eyes()
for(var/i = 1, i <= amount_to_spawn, i++)
var/chosen
if (reaction_name == "Friendly Gold Slime")
var/chosen = pick(nicecritters)
var/mob/living/simple_animal/C = new chosen
C.faction |= mob_faction
C.loc = get_turf(holder.my_atom)
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
step(C, pick(NORTH,SOUTH,EAST,WEST))
chosen = pick(nicecritters)
else
var/chosen = pick(meancritters)
var/mob/living/simple_animal/hostile/C = new chosen
C.faction |= mob_faction
C.loc = get_turf(holder.my_atom)
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
step(C, pick(NORTH,SOUTH,EAST,WEST))
chosen = pick(meancritters)
var/mob/living/simple_animal/C = new chosen
C.faction |= mob_faction
C.loc = get_turf(holder.my_atom)
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
step(C, pick(NORTH,SOUTH,EAST,WEST))
/datum/chemical_reaction/proc/goonchem_vortex(turf/simulated/T, setting_type, range)
for(var/atom/movable/X in orange(range, T))
@@ -116,6 +116,12 @@
required_reagents = list("sodium" = 1, "phenol" = 1, "carbon" = 1, "oxygen" = 1, "sacid" = 1)
result_amount = 5
/datum/chemical_reaction/oxandrolone
name = "Oxandrolone"
id = "oxandrolone"
result = "oxandrolone"
required_reagents = list("carbon" = 3, "phenol" = 1, "hydrogen" = 1, "oxygen" = 1)
result_amount = 6
/datum/chemical_reaction/salbutamol
name = "Salbutamol"
@@ -133,6 +133,12 @@
icon_state = "pill5"
list_reagents = list("sal_acid" = 24)
roundstart = 1
/obj/item/weapon/reagent_containers/pill/oxandrolone
name = "oxandrolone pill"
desc = "Used to stimulate burn healing."
icon_state = "pill5"
list_reagents = list("oxandrolone" = 24)
roundstart = 1
/obj/item/weapon/reagent_containers/pill/insulin
name = "insulin pill"
+2 -1
View File
@@ -703,7 +703,8 @@
R.realProc = realProc
R.revealed = TRUE
dupes |= R
R.throw_at(pick(oview(7,get_turf(src))),10,1)
spawn()
R.throw_at(pick(oview(7,get_turf(src))),10,1)
counter = 0
spawn(rand(10,100))
for(counter = 1; counter <= dupes.len; counter++)