mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2026-01-06 07:22:42 +00:00
Merge branch 'bleeding-edge-freeze' of https://github.com/Baystation12/Baystation12
Conflicts: code/modules/reagents/Chemistry-Reagents.dm code/setup.dm
This commit is contained in:
@@ -61,7 +61,7 @@
|
||||
|
||||
//If there are alien weeds on the ground then heal if needed or give some toxins
|
||||
if(locate(/obj/effect/alien/weeds) in loc)
|
||||
if(health >= maxHealth)
|
||||
if(health >= maxHealth - getCloneLoss())
|
||||
adjustToxLoss(plasma_rate)
|
||||
else
|
||||
adjustBruteLoss(-heal_rate)
|
||||
|
||||
@@ -191,7 +191,7 @@
|
||||
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>The [M.name] has [pick("bit","slashed")] []!</B>", src), 1)
|
||||
O.show_message(text("\red <B>The [M.name] glomps []!</B>", src), 1)
|
||||
|
||||
var/damage = rand(1, 3)
|
||||
|
||||
@@ -324,7 +324,7 @@
|
||||
if ("hurt")
|
||||
var/damage = rand(1, 9)
|
||||
if (prob(90))
|
||||
if ((HULK in M.mutations) || (SUPRSTR in M.augmentations))//HULK SMASH
|
||||
if (HULK in M.mutations)//HULK SMASH
|
||||
damage += 14
|
||||
spawn(0)
|
||||
Weaken(damage) // Why can a hulk knock an alien out but not knock out a human? Damage is robust enough.
|
||||
|
||||
@@ -216,7 +216,7 @@
|
||||
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>The [M.name] has [pick("bit","slashed")] []!</B>", src), 1)
|
||||
O.show_message(text("\red <B>The [M.name] glomps []!</B>", src), 1)
|
||||
|
||||
var/damage = rand(1, 3)
|
||||
|
||||
@@ -304,7 +304,7 @@
|
||||
else
|
||||
var/damage = rand(1, 9)
|
||||
if (prob(90))
|
||||
if ((HULK in M.mutations) || (SUPRSTR in M.augmentations))
|
||||
if (HULK in M.mutations)
|
||||
damage += 5
|
||||
spawn(0)
|
||||
Paralyse(1)
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
return
|
||||
|
||||
if (length(message) >= 2)
|
||||
if (copytext(message, 1, 3) == ":a")
|
||||
if (copytext(message, 1, 3) == ":a" || copytext(message, 1, 3) == "#a" || copytext(message, 1, 3) == ".a" )
|
||||
message = copytext(message, 3)
|
||||
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
|
||||
if (stat == 2)
|
||||
|
||||
@@ -26,12 +26,13 @@
|
||||
..()
|
||||
|
||||
/obj/item/alien_embryo/process()
|
||||
if(!affected_mob) return
|
||||
if(loc != affected_mob)
|
||||
affected_mob.status_flags &= ~(XENO_HOST)
|
||||
processing_objects.Remove(src)
|
||||
affected_mob = null
|
||||
spawn(0)
|
||||
RemoveInfectionImages(affected_mob)
|
||||
affected_mob = null
|
||||
return
|
||||
|
||||
if(stage < 5 && prob(3))
|
||||
|
||||
@@ -507,158 +507,6 @@
|
||||
src.hud_used.hotkey_ui_hidden = 1
|
||||
|
||||
|
||||
|
||||
/*
|
||||
|
||||
Radar-related things
|
||||
|
||||
*/
|
||||
|
||||
/mob/living/carbon/human/proc/close_radar()
|
||||
radar_open = 0
|
||||
for(var/obj/screen/x in client.screen)
|
||||
if( (x.name == "radar" && x.icon == 'icons/misc/radar.dmi') || (x in radar_blips) )
|
||||
client.screen -= x
|
||||
del(x)
|
||||
|
||||
place_radar_closed()
|
||||
|
||||
/mob/living/carbon/human/proc/place_radar_closed()
|
||||
var/obj/screen/closedradar = new()
|
||||
closedradar.icon = 'icons/misc/radar.dmi'
|
||||
closedradar.icon_state = "radarclosed"
|
||||
closedradar.screen_loc = "WEST,NORTH-1"
|
||||
closedradar.name = "radar closed"
|
||||
client.screen += closedradar
|
||||
|
||||
/mob/living/carbon/human/proc/start_radar()
|
||||
|
||||
for(var/obj/screen/x in client.screen)
|
||||
if(x.name == "radar closed" && x.icon == 'icons/misc/radar.dmi')
|
||||
client.screen -= x
|
||||
del(x)
|
||||
|
||||
var/obj/screen/cornerA = new()
|
||||
cornerA.icon = 'icons/misc/radar.dmi'
|
||||
cornerA.icon_state = "radar(1,1)"
|
||||
cornerA.screen_loc = "WEST,NORTH-2"
|
||||
cornerA.name = "radar"
|
||||
|
||||
var/obj/screen/cornerB = new()
|
||||
cornerB.icon = 'icons/misc/radar.dmi'
|
||||
cornerB.icon_state = "radar(2,1)"
|
||||
cornerB.screen_loc = "WEST+1,NORTH-2"
|
||||
cornerB.name = "radar"
|
||||
|
||||
var/obj/screen/cornerC = new()
|
||||
cornerC.icon = 'icons/misc/radar.dmi'
|
||||
cornerC.icon_state = "radar(1,2)"
|
||||
cornerC.screen_loc = "WEST,NORTH-1"
|
||||
cornerC.name = "radar"
|
||||
|
||||
var/obj/screen/cornerD = new()
|
||||
cornerD.icon = 'icons/misc/radar.dmi'
|
||||
cornerD.icon_state = "radar(2,2)"
|
||||
cornerD.screen_loc = "WEST+1,NORTH-1"
|
||||
cornerD.name = "radar"
|
||||
|
||||
client.screen += cornerA
|
||||
client.screen += cornerB
|
||||
client.screen += cornerC
|
||||
client.screen += cornerD
|
||||
|
||||
radar_open = 1
|
||||
|
||||
while(radar_open && (RADAR in augmentations))
|
||||
update_radar()
|
||||
sleep(6)
|
||||
|
||||
/mob/living/carbon/human/proc/update_radar()
|
||||
|
||||
if(!client) return
|
||||
var/list/found_targets = list()
|
||||
|
||||
var/max_dist = 29 // 29 tiles is the max distance
|
||||
|
||||
// If the mob is inside a turf, set the center to the object they're in
|
||||
var/atom/distance_ref = src
|
||||
if(!isturf(src.loc))
|
||||
distance_ref = loc
|
||||
|
||||
// Clear the radar_blips cache
|
||||
for(var/x in radar_blips)
|
||||
client.screen -= x
|
||||
del(x)
|
||||
radar_blips = list()
|
||||
|
||||
var/starting_px = 3
|
||||
var/starting_py = 3
|
||||
|
||||
for(var/mob/living/M in orange(max_dist, distance_ref))
|
||||
if(M.stat == 2) continue
|
||||
found_targets.Add(M)
|
||||
|
||||
for(var/obj/mecha/M in orange(max_dist, distance_ref))
|
||||
if(!M.occupant) continue
|
||||
found_targets.Add(M)
|
||||
|
||||
for(var/obj/structure/closet/C in orange(max_dist, distance_ref))
|
||||
for(var/mob/living/M in C.contents)
|
||||
if(M.stat == 2) continue
|
||||
found_targets.Add(M)
|
||||
|
||||
// Loop through all living mobs in a range.
|
||||
for(var/atom/A in found_targets)
|
||||
|
||||
var/a_x = A.x
|
||||
var/a_y = A.y
|
||||
|
||||
if(!isturf(A.loc))
|
||||
a_x = A.loc.x
|
||||
a_y = A.loc.y
|
||||
|
||||
var/blip_x = max_dist + (-( distance_ref.x-a_x ) ) + starting_px
|
||||
var/blip_y = max_dist + (-( distance_ref.y-a_y ) ) + starting_py
|
||||
var/obj/screen/blip = new()
|
||||
blip.icon = 'icons/misc/radar.dmi'
|
||||
blip.name = "Blip"
|
||||
blip.layer = 21
|
||||
blip.screen_loc = "WEST:[blip_x-1],NORTH-2:[blip_y-1]" // offset -1 because the center of the blip is not at the bottomleft corner (14)
|
||||
|
||||
if(istype(A, /mob/living))
|
||||
var/mob/living/M = A
|
||||
if(ishuman(M))
|
||||
if(M:wear_id)
|
||||
var/job = M:wear_id:GetJobRealName()
|
||||
if(job == "Security Officer")
|
||||
blip.icon_state = "secblip"
|
||||
blip.name = "Security Officer"
|
||||
else if(job == "Captain" || job == "Research Director" || job == "Chief Engineer" || job == "Chief Medical Officer" || job == "Head of Security" || job == "Head of Personnel")
|
||||
blip.icon_state = "headblip"
|
||||
blip.name = "Station Head"
|
||||
else
|
||||
blip.icon_state = "civblip"
|
||||
blip.name = "Civilian"
|
||||
else
|
||||
blip.icon_state = "civblip"
|
||||
blip.name = "Civilian"
|
||||
|
||||
else if(issilicon(M))
|
||||
blip.icon_state = "roboblip"
|
||||
blip.name = "Robotic Organism"
|
||||
|
||||
else
|
||||
blip.icon_state = "unknownblip"
|
||||
blip.name = "Unknown Organism"
|
||||
|
||||
else if(istype(A, /obj/mecha))
|
||||
blip.icon_state = "roboblip"
|
||||
blip.name = "Robotic Organism"
|
||||
|
||||
radar_blips.Add(blip)
|
||||
client.screen += blip
|
||||
|
||||
|
||||
/mob/living/carbon/human/update_action_buttons()
|
||||
var/num = 1
|
||||
if(!src.hud_used) return
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
mob/var/image/antag_img
|
||||
mob/living/carbon/human
|
||||
var/image/med_img
|
||||
var/image/sec_img
|
||||
var/image/sec2_img
|
||||
var/image/imp_img
|
||||
var/image/health_img
|
||||
|
||||
mob/New()
|
||||
. = ..()
|
||||
antag_img = image('icons/mob/hud.dmi',src)
|
||||
|
||||
mob/living/carbon/human/New()
|
||||
. = ..()
|
||||
med_img = image('icons/mob/hud.dmi',src)
|
||||
sec_img = image('icons/mob/hud.dmi',src)
|
||||
sec2_img = image('icons/mob/hud.dmi',src)
|
||||
imp_img = image('icons/mob/hud.dmi',src)
|
||||
health_img = image('icons/mob/hud.dmi',src)
|
||||
@@ -245,17 +245,19 @@
|
||||
|
||||
f_loss += 60
|
||||
|
||||
if (!prob(getarmor(null, "bomb")))
|
||||
if (prob(getarmor(null, "bomb")))
|
||||
b_loss = b_loss/1.5
|
||||
f_loss = f_loss/1.5
|
||||
|
||||
if (!istype(ears, /obj/item/clothing/ears/earmuffs))
|
||||
ear_damage += 30
|
||||
ear_deaf += 120
|
||||
if (prob(70) && !shielded)
|
||||
Paralyse(10)
|
||||
|
||||
if(3.0)
|
||||
b_loss += 30
|
||||
if (!prob(getarmor(null, "bomb")))
|
||||
if (prob(getarmor(null, "bomb")))
|
||||
b_loss = b_loss/2
|
||||
if (!istype(ears, /obj/item/clothing/ears/earmuffs))
|
||||
ear_damage += 15
|
||||
@@ -367,7 +369,7 @@
|
||||
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>The [M.name] has [pick("bit","slashed")] []!</B>", src), 1)
|
||||
O.show_message(text("\red <B>The [M.name] glomps []!</B>", src), 1)
|
||||
|
||||
var/damage = rand(1, 3)
|
||||
|
||||
@@ -596,29 +598,32 @@
|
||||
return
|
||||
*/
|
||||
|
||||
var/perpname = "wot"
|
||||
var/modified = 0
|
||||
|
||||
var/perpname = "wot"
|
||||
if(wear_id)
|
||||
var/obj/item/weapon/card/id/I = wear_id.GetID()
|
||||
perpname = I.registered_name
|
||||
if(I)
|
||||
perpname = I.registered_name
|
||||
else
|
||||
perpname = name
|
||||
else
|
||||
perpname = src.name
|
||||
perpname = name
|
||||
|
||||
for (var/datum/data/record/E in data_core.general)
|
||||
if (E.fields["name"] == perpname)
|
||||
for (var/datum/data/record/R in data_core.security)
|
||||
if (R.fields["id"] == E.fields["id"])
|
||||
if(perpname)
|
||||
for (var/datum/data/record/E in data_core.general)
|
||||
if (E.fields["name"] == perpname)
|
||||
for (var/datum/data/record/R in data_core.security)
|
||||
if (R.fields["id"] == E.fields["id"])
|
||||
|
||||
var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list("None", "*Arrest*", "Incarcerated", "Parolled", "Released", "Cancel")
|
||||
var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list("None", "*Arrest*", "Incarcerated", "Parolled", "Released", "Cancel")
|
||||
|
||||
if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))
|
||||
if(setcriminal != "Cancel")
|
||||
R.fields["criminal"] = setcriminal
|
||||
modified = 1
|
||||
if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))
|
||||
if(setcriminal != "Cancel")
|
||||
R.fields["criminal"] = setcriminal
|
||||
modified = 1
|
||||
|
||||
spawn()
|
||||
H.handle_regular_hud_updates()
|
||||
spawn()
|
||||
H.handle_regular_hud_updates()
|
||||
|
||||
if(!modified)
|
||||
usr << "\red Unable to locate a data core entry for this person."
|
||||
|
||||
@@ -41,7 +41,6 @@
|
||||
var/armor_block = run_armor_check(affecting, "melee")
|
||||
|
||||
if(HULK in M.mutations) damage += 5
|
||||
if(SUPRSTR in M.augmentations) damage += 5
|
||||
|
||||
playsound(loc, "punch", 25, 1, -1)
|
||||
|
||||
@@ -97,24 +96,6 @@
|
||||
|
||||
if("hurt")
|
||||
|
||||
if(ELECTRICHANDS in M.augmentations)
|
||||
var/gendertxt = "their"
|
||||
if(M.gender == MALE)
|
||||
gendertxt = "his"
|
||||
if(M.gender == FEMALE)
|
||||
gendertxt = "her"
|
||||
|
||||
visible_message("\red <B>[M] has shocked [src] with [gendertxt] bare hands!</B>")
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Used Electric Hands nanoaug power on [src.name] ([src.ckey])</font>")
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been shocked by [M.name] with the Electric Hands nanoaug ([M.ckey])</font>")
|
||||
|
||||
log_attack("<font color='red'>[M.name] ([M.ckey]) used Electric Hands nanoaug on [src.name]([src.ckey]), shocking them </font>")
|
||||
|
||||
var/armorblock = run_armor_check(M.zone_sel.selecting, "energy")
|
||||
apply_effects(5,5,0,0,5,0,0,armorblock)
|
||||
|
||||
return
|
||||
|
||||
var/attack_verb
|
||||
if(M.dna)
|
||||
switch(M.dna.mutantrace)
|
||||
@@ -150,7 +131,6 @@
|
||||
var/armor_block = run_armor_check(affecting, "melee")
|
||||
|
||||
if(HULK in M.mutations) damage += 5
|
||||
if(SUPRSTR in M.augmentations) damage += 5
|
||||
|
||||
|
||||
switch(attack_verb)
|
||||
@@ -162,7 +142,7 @@
|
||||
playsound(loc, "punch", 25, 1, -1)
|
||||
|
||||
visible_message("\red <B>[M] has [attack_verb]ed [src]!</B>")
|
||||
//Rearranged, so claws don't increase weaken chance.
|
||||
//Rearranged, so claws don't increase weaken chance.
|
||||
if(damage >= 5 && prob(50))
|
||||
visible_message("\red <B>[M] has weakened [src]!</B>")
|
||||
apply_effect(2, WEAKEN, armor_block)
|
||||
|
||||
@@ -171,9 +171,6 @@
|
||||
if(blocked)
|
||||
damage = (damage/(blocked+1))
|
||||
|
||||
if(DERMALARMOR in augmentations)
|
||||
damage = damage - (round(damage*0.35)) // reduce damage by 35%
|
||||
|
||||
switch(damagetype)
|
||||
if(BRUTE)
|
||||
damageoverlaytemp = 20
|
||||
|
||||
@@ -366,94 +366,6 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
|
||||
if((COLD_RESISTANCE in mutations) || (prob(1)))
|
||||
heal_organ_damage(0,1)
|
||||
|
||||
if(mHallucination in mutations)
|
||||
hallucination = 100
|
||||
halloss = 0
|
||||
|
||||
if(mSmallsize in mutations)
|
||||
if(!(pass_flags & PASSTABLE))
|
||||
pass_flags |= PASSTABLE
|
||||
else
|
||||
if(pass_flags & PASSTABLE)
|
||||
pass_flags &= ~PASSTABLE
|
||||
|
||||
// Make nanoregen heal youu, -3 all damage types
|
||||
if((NANOREGEN in augmentations) || (mRegen in mutations))
|
||||
var/healed = 0
|
||||
var/hptoreg = 0
|
||||
if(NANOREGEN in augmentations)
|
||||
hptoreg += 3
|
||||
if(mRegen in mutations)
|
||||
hptoreg += 2
|
||||
if(stat==UNCONSCIOUS) hptoreg/=2
|
||||
if(stat==DEAD) hptoreg=0
|
||||
|
||||
for(var/i=0, i<hptoreg, i++)
|
||||
var/list/damages = new/list()
|
||||
if(getToxLoss())
|
||||
damages+="tox"
|
||||
if(getOxyLoss())
|
||||
damages+="oxy"
|
||||
if(getCloneLoss())
|
||||
damages+="clone"
|
||||
if(getBruteLoss())
|
||||
damages+="brute"
|
||||
if(getFireLoss())
|
||||
damages+="burn"
|
||||
if(halloss != 0)
|
||||
damages+="hal"
|
||||
|
||||
if(damages.len)
|
||||
switch(pick(damages))
|
||||
if("tox")
|
||||
adjustToxLoss(-1)
|
||||
healed = 1
|
||||
if("oxy")
|
||||
adjustOxyLoss(-1)
|
||||
healed = 1
|
||||
if("clone")
|
||||
adjustCloneLoss(-1)
|
||||
healed = 1
|
||||
if("brute")
|
||||
heal_organ_damage(1,0)
|
||||
healed = 1
|
||||
if("burn")
|
||||
heal_organ_damage(0,1)
|
||||
healed = 1
|
||||
if("hal")
|
||||
if(halloss > 0)
|
||||
halloss -= 1
|
||||
if(halloss < 0)
|
||||
halloss = 0
|
||||
healed = 1
|
||||
else
|
||||
break
|
||||
|
||||
if(healed)
|
||||
if(prob(5))
|
||||
src << "\blue You feel your wounds mending..."
|
||||
|
||||
if(!(/mob/living/carbon/human/proc/morph in src.verbs))
|
||||
if(mMorph in mutations)
|
||||
src.verbs += /mob/living/carbon/human/proc/morph
|
||||
else
|
||||
if(!(mMorph in mutations))
|
||||
src.verbs -= /mob/living/carbon/human/proc/morph
|
||||
|
||||
if(!(/mob/living/carbon/human/proc/remoteobserve in src.verbs))
|
||||
if(mRemote in mutations)
|
||||
src.verbs += /mob/living/carbon/human/proc/remoteobserve
|
||||
else
|
||||
if(!(mRemote in mutations))
|
||||
src.verbs -= /mob/living/carbon/human/proc/remoteobserve
|
||||
|
||||
if(!(/mob/living/carbon/human/proc/remotesay in src.verbs))
|
||||
if(mRemotetalk in mutations)
|
||||
src.verbs += /mob/living/carbon/human/proc/remotesay
|
||||
else
|
||||
if(!(mRemotetalk in mutations))
|
||||
src.verbs -= /mob/living/carbon/human/proc/remotesay
|
||||
|
||||
if ((HULK in mutations) && health <= 25)
|
||||
mutations.Remove(HULK)
|
||||
update_mutations() //update our mutation overlays
|
||||
@@ -606,7 +518,8 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
|
||||
|
||||
|
||||
proc/handle_breath(datum/gas_mixture/breath)
|
||||
if((status_flags & GODMODE) || REBREATHER in augmentations) return
|
||||
if(status_flags & GODMODE)
|
||||
return
|
||||
|
||||
if(!breath || (breath.total_moles() == 0) || suiciding)
|
||||
if(reagents.has_reagent("inaprovaline"))
|
||||
@@ -687,8 +600,10 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
|
||||
co2overloadtime = 0
|
||||
|
||||
if(Toxins_pp > safe_toxins_max) // Too much toxins
|
||||
var/ratio = breath.toxins/safe_toxins_max
|
||||
adjustToxLoss(min(ratio, MIN_PLASMA_DAMAGE)) //Limit amount of damage toxin exposure can do per second
|
||||
var/ratio = (breath.toxins/safe_toxins_max) * 10
|
||||
//adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) //Limit amount of damage toxin exposure can do per second
|
||||
if(reagents)
|
||||
reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
|
||||
toxins_alert = max(toxins_alert, 1)
|
||||
else
|
||||
toxins_alert = 0
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/mob/living/carbon/human/say(var/message)
|
||||
|
||||
if (silent)
|
||||
if(silent)
|
||||
return
|
||||
|
||||
//Mimes dont speak! Changeling hivemind and emotes are allowed.
|
||||
@@ -18,11 +18,12 @@
|
||||
if (copytext(message, 1, 2) != "*")
|
||||
return
|
||||
|
||||
if(src.dna)
|
||||
/*if(src.dna.mutantrace == "lizard") //Soghun stutterss-s-ss-sss.
|
||||
/*if(dna)
|
||||
if(dna.mutantrace == "lizard")
|
||||
if(copytext(message, 1, 2) != "*")
|
||||
message = replacetext(message, "s", stutter("ss"))*/
|
||||
if(src.dna.mutantrace == "slime" && prob(5))
|
||||
message = replacetext(message, "s", stutter("ss"))
|
||||
|
||||
if(dna.mutantrace == "slime" && prob(5))
|
||||
if(copytext(message, 1, 2) != "*")
|
||||
if(copytext(message, 1, 2) == ";")
|
||||
message = ";"
|
||||
@@ -31,7 +32,7 @@
|
||||
message += "SKR"
|
||||
var/imax = rand(5,20)
|
||||
for(var/i = 0,i<imax,i++)
|
||||
message += "E"
|
||||
message += "E"*/
|
||||
|
||||
if(stat != DEAD)
|
||||
for(var/datum/disease/pierrot_throat/D in viruses)
|
||||
@@ -47,79 +48,58 @@
|
||||
pick_list -= H //Make sure that you dont HONK the same word twice
|
||||
message = dd_list2text(temp_message, " ")
|
||||
|
||||
if(istype(src.wear_mask, /obj/item/clothing/mask/luchador))
|
||||
if(copytext(message, 1, 2) != "*")
|
||||
message = replacetext(message, "captain", "CAPIT<49>N")
|
||||
message = replacetext(message, "station", "ESTACI<43>N")
|
||||
message = replacetext(message, "sir", "SE<53>OR")
|
||||
message = replacetext(message, "the ", "el ")
|
||||
message = replacetext(message, "my ", "mi ")
|
||||
message = replacetext(message, "is ", "es ")
|
||||
message = replacetext(message, "it's", "es")
|
||||
message = replacetext(message, "friend", "amigo")
|
||||
message = replacetext(message, "buddy", "amigo")
|
||||
message = replacetext(message, "hello", "hola")
|
||||
message = replacetext(message, " hot", " caliente")
|
||||
message = replacetext(message, " very ", " muy ")
|
||||
message = replacetext(message, "sword", "espada")
|
||||
message = replacetext(message, "library", "biblioteca")
|
||||
message = replacetext(message, "traitor", "traidor")
|
||||
message = replacetext(message, "wizard", "mago")
|
||||
message = uppertext(message) //Things end up looking better this way (no mixed cases), and it fits the macho wrestler image.
|
||||
if(prob(25))
|
||||
message += " OLE!"
|
||||
if(wear_mask)
|
||||
if(istype(wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja) && wear_mask:voice == "Unknown")
|
||||
if(copytext(message, 1, 2) != "*")
|
||||
var/list/temp_message = text2list(message, " ")
|
||||
var/list/pick_list = list()
|
||||
for(var/i = 1, i <= temp_message.len, i++)
|
||||
pick_list += i
|
||||
for(var/i=1, i <= abs(temp_message.len/3), i++)
|
||||
var/H = pick(pick_list)
|
||||
if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) continue
|
||||
temp_message[H] = ninjaspeak(temp_message[H])
|
||||
pick_list -= H
|
||||
message = dd_list2text(temp_message, " ")
|
||||
message = replacetext(message, "o", "<22>")
|
||||
message = replacetext(message, "p", "<22>")
|
||||
message = replacetext(message, "l", "<22>")
|
||||
message = replacetext(message, "s", "<22>")
|
||||
message = replacetext(message, "u", "<22>")
|
||||
message = replacetext(message, "b", "<22>")
|
||||
|
||||
else if(istype(wear_mask, /obj/item/clothing/mask/luchador))
|
||||
if(copytext(message, 1, 2) != "*")
|
||||
message = replacetext(message, "captain", "CAPIT<49>N")
|
||||
message = replacetext(message, "station", "ESTACI<43>N")
|
||||
message = replacetext(message, "sir", "SE<53>OR")
|
||||
message = replacetext(message, "the ", "el ")
|
||||
message = replacetext(message, "my ", "mi ")
|
||||
message = replacetext(message, "is ", "es ")
|
||||
message = replacetext(message, "it's", "es")
|
||||
message = replacetext(message, "friend", "amigo")
|
||||
message = replacetext(message, "buddy", "amigo")
|
||||
message = replacetext(message, "hello", "hola")
|
||||
message = replacetext(message, " hot", " caliente")
|
||||
message = replacetext(message, " very ", " muy ")
|
||||
message = replacetext(message, "sword", "espada")
|
||||
message = replacetext(message, "library", "biblioteca")
|
||||
message = replacetext(message, "traitor", "traidor")
|
||||
message = replacetext(message, "wizard", "mago")
|
||||
message = uppertext(message) //Things end up looking better this way (no mixed cases), and it fits the macho wrestler image.
|
||||
if(prob(25))
|
||||
message += " OLE!"
|
||||
|
||||
else if(istype(wear_mask, /obj/item/clothing/mask/horsehead))
|
||||
var/obj/item/clothing/mask/horsehead/hoers = wear_mask
|
||||
if(hoers.voicechange)
|
||||
if(!(copytext(message, 1, 2) == "*" || (mind && mind.changeling && (copytext(message, 1, 3) == ":g" || copytext(message, 1, 3) == ":G" || copytext(message, 1, 3) == ":<3A>"))))
|
||||
message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
|
||||
|
||||
if ((HULK in mutations) && health >= 25 && length(message))
|
||||
if(copytext(message, 1, 2) != "*")
|
||||
message = "[uppertext(message)]!!" //because I don't know how to code properly in getting vars from other files -Bro
|
||||
|
||||
//Ninja mask obscures text and voice if set to do so.
|
||||
//Would make it more global but it's sort of ninja specific.
|
||||
if(istype(src.wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja)&&src.wear_mask:voice=="Unknown")
|
||||
if(copytext(message, 1, 2) != "*")
|
||||
var/list/temp_message = text2list(message, " ")
|
||||
var/list/pick_list = list()
|
||||
for(var/i = 1, i <= temp_message.len, i++)
|
||||
pick_list += i
|
||||
for(var/i=1, i <= abs(temp_message.len/3), i++)
|
||||
var/H = pick(pick_list)
|
||||
if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) continue
|
||||
temp_message[H] = ninjaspeak(temp_message[H])
|
||||
pick_list -= H
|
||||
message = dd_list2text(temp_message, " ")
|
||||
message = replacetext(message, "o", "<22>")
|
||||
message = replacetext(message, "p", "<22>")
|
||||
message = replacetext(message, "l", "<22>")
|
||||
message = replacetext(message, "s", "<22>")
|
||||
message = replacetext(message, "u", "<22>")
|
||||
message = replacetext(message, "b", "<22>")
|
||||
/*This text is hilarious but also absolutely retarded.
|
||||
message = replacetext(message, "l", "r")
|
||||
message = replacetext(message, "rr", "ru")
|
||||
message = replacetext(message, "v", "b")
|
||||
message = replacetext(message, "f", "hu")
|
||||
message = replacetext(message, "'t", "")
|
||||
message = replacetext(message, "t ", "to ")
|
||||
message = replacetext(message, " I ", " ai ")
|
||||
message = replacetext(message, "th", "z")
|
||||
message = replacetext(message, "ish", "isu")
|
||||
message = replacetext(message, "is", "izu")
|
||||
message = replacetext(message, "ziz", "zis")
|
||||
message = replacetext(message, "se", "su")
|
||||
message = replacetext(message, "br", "bur")
|
||||
message = replacetext(message, "ry", "ri")
|
||||
message = replacetext(message, "you", "yuu")
|
||||
message = replacetext(message, "ck", "cku")
|
||||
message = replacetext(message, "eu", "uu")
|
||||
message = replacetext(message, "ow", "au")
|
||||
message = replacetext(message, "are", "aa")
|
||||
message = replacetext(message, "ay", "ayu")
|
||||
message = replacetext(message, "ea", "ii")
|
||||
message = replacetext(message, "ch", "chi")
|
||||
message = replacetext(message, "than", "sen")
|
||||
message = replacetext(message, ".", "")
|
||||
message = lowertext(message)
|
||||
*/
|
||||
if (src.slurring)
|
||||
message = slur(message)
|
||||
..(message)
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
//Lallander was here
|
||||
/mob/living/carbon/human/whisper(message as text)
|
||||
if(say_disabled) //This is here to try to identify lag problems
|
||||
usr << "\red Speech is currently admin-disabled."
|
||||
return
|
||||
|
||||
message = trim(copytext(strip_html_simple(message), 1, MAX_MESSAGE_LEN))
|
||||
|
||||
if (!message || silent || miming)
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
..()
|
||||
|
||||
/mob/living/carbon/slime/adult/New()
|
||||
verbs.Remove(/mob/living/carbon/slime/verb/ventcrawl)
|
||||
//verbs.Remove(/mob/living/carbon/slime/verb/ventcrawl)
|
||||
..()
|
||||
|
||||
/mob/living/carbon/slime/movement_delay()
|
||||
@@ -298,7 +298,7 @@
|
||||
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>The [M.name] has bit []!</B>", src), 1)
|
||||
O.show_message(text("\red <B>The [M.name] has glomped []!</B>", src), 1)
|
||||
|
||||
var/damage = rand(1, 3)
|
||||
attacked += 5
|
||||
@@ -472,21 +472,12 @@
|
||||
O.show_message(text("\red [] has grabbed [] passively!", M, src), 1)
|
||||
|
||||
else
|
||||
if(ELECTRICHANDS in M.augmentations)
|
||||
var/gendertxt = "their"
|
||||
if(M.gender == MALE)
|
||||
gendertxt = "his"
|
||||
if(M.gender == FEMALE)
|
||||
gendertxt = "her"
|
||||
|
||||
visible_message("\red <B>[M] has shocked [src] with [gendertxt] bare hands!</B>")
|
||||
return
|
||||
|
||||
var/damage = rand(1, 9)
|
||||
|
||||
attacked += 10
|
||||
if (prob(90))
|
||||
if ((HULK in M.mutations) || (SUPRSTR in M.augmentations))
|
||||
if (HULK in M.mutations)
|
||||
damage += 5
|
||||
if(Victim)
|
||||
Victim = null
|
||||
@@ -922,13 +913,13 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75
|
||||
w_class = 4//bulky item
|
||||
gas_transfer_coefficient = 0.90
|
||||
permeability_coefficient = 0.50
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
|
||||
slowdown = 3.0
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS|HEAD
|
||||
slowdown = 1.0
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
|
||||
flags = FPRINT | TABLEPASS | ONESIZEFITSALL | STOPSPRESSUREDMAGE
|
||||
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
|
||||
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS | HEAD
|
||||
max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECITON_TEMPERATURE
|
||||
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
|
||||
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS | HEAD
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECITON_TEMPERATURE
|
||||
canremove = 0
|
||||
armor = list(melee = 80, bullet = 20, laser = 20, energy = 10, bomb = 0, bio = 0, rad = 0)
|
||||
@@ -952,6 +943,16 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75
|
||||
siemens_coefficient = 0
|
||||
unacidable = 1
|
||||
|
||||
/obj/item/clothing/mask/gas/golem
|
||||
name = "golem's face"
|
||||
desc = "the imposing face of an adamantine golem"
|
||||
icon_state = "golem"
|
||||
item_state = "golem"
|
||||
canremove = 0
|
||||
siemens_coefficient = 0
|
||||
unacidable = 1
|
||||
|
||||
|
||||
/obj/item/clothing/gloves/golem
|
||||
name = "golem's hands"
|
||||
desc = "strong adamantine hands"
|
||||
@@ -961,8 +962,75 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75
|
||||
canremove = 0
|
||||
|
||||
|
||||
/obj/item/clothing/head/space/golem
|
||||
icon_state = "golem"
|
||||
item_state = "dermal"
|
||||
color = "dermal"
|
||||
name = "golem's head"
|
||||
desc = "a golem's head"
|
||||
canremove = 0
|
||||
unacidable = 1
|
||||
flags = FPRINT | TABLEPASS | STOPSPRESSUREDMAGE
|
||||
heat_protection = HEAD
|
||||
max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECITON_TEMPERATURE
|
||||
armor = list(melee = 80, bullet = 20, laser = 20, energy = 10, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
/obj/effect/golemrune
|
||||
anchored = 1
|
||||
desc = "a strange rune used to create golems. It glows when spirits are nearby."
|
||||
name = "rune"
|
||||
icon = 'icons/obj/rune.dmi'
|
||||
icon_state = "golem"
|
||||
unacidable = 1
|
||||
layer = TURF_LAYER
|
||||
|
||||
New()
|
||||
..()
|
||||
processing_objects.Add(src)
|
||||
|
||||
process()
|
||||
var/mob/dead/observer/ghost
|
||||
for(var/mob/dead/observer/O in src.loc)
|
||||
if(!O.client) continue
|
||||
if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
|
||||
ghost = O
|
||||
break
|
||||
if(ghost)
|
||||
icon_state = "golem2"
|
||||
else
|
||||
icon_state = "golem"
|
||||
|
||||
attack_hand(mob/living/user as mob)
|
||||
var/mob/dead/observer/ghost
|
||||
for(var/mob/dead/observer/O in src.loc)
|
||||
if(!O.client) continue
|
||||
if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
|
||||
ghost = O
|
||||
break
|
||||
if(!ghost)
|
||||
user << "The rune fizzles uselessly. There is no spirit nearby."
|
||||
return
|
||||
var/mob/living/carbon/human/G = new /mob/living/carbon/human
|
||||
G.dna.mutantrace = "adamantine"
|
||||
G.real_name = text("Adamantine Golem ([rand(1, 1000)])")
|
||||
G.equip_to_slot_or_del(new /obj/item/clothing/under/golem(G), slot_w_uniform)
|
||||
G.equip_to_slot_or_del(new /obj/item/clothing/suit/golem(G), slot_wear_suit)
|
||||
G.equip_to_slot_or_del(new /obj/item/clothing/shoes/golem(G), slot_shoes)
|
||||
G.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/golem(G), slot_wear_mask)
|
||||
G.equip_to_slot_or_del(new /obj/item/clothing/gloves/golem(G), slot_gloves)
|
||||
//G.equip_to_slot_or_del(new /obj/item/clothing/head/space/golem(G), slot_head)
|
||||
G.loc = src.loc
|
||||
G.key = ghost.key
|
||||
G << "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost."
|
||||
del (src)
|
||||
|
||||
|
||||
proc/announce_to_ghosts()
|
||||
for(var/mob/dead/observer/G in player_list)
|
||||
if(G.client)
|
||||
var/area/A = get_area(src)
|
||||
if(A)
|
||||
G << "Golem rune created in [A.name]."
|
||||
//////////////////////////////Old shit from metroids/RoRos, and the old cores, would not take much work to re-add them////////////////////////
|
||||
|
||||
/*
|
||||
|
||||
@@ -180,7 +180,7 @@
|
||||
new_slime.powerlevel = max(0, powerlevel-1)
|
||||
new_slime.a_intent = "hurt"
|
||||
new_slime.key = key
|
||||
|
||||
new_slime.universal_speak = universal_speak
|
||||
new_slime << "<B>You are now an adult slime.</B>"
|
||||
del(src)
|
||||
else
|
||||
@@ -243,6 +243,7 @@
|
||||
|
||||
var/mob/living/carbon/slime/new_slime = pick(babies)
|
||||
new_slime.a_intent = "hurt"
|
||||
new_slime.universal_speak = universal_speak
|
||||
new_slime.key = key
|
||||
|
||||
new_slime << "<B>You are now a slime!</B>"
|
||||
|
||||
@@ -287,8 +287,10 @@
|
||||
co2overloadtime = 0
|
||||
|
||||
if(Toxins_pp > safe_toxins_max) // Too much toxins
|
||||
var/ratio = breath.toxins/safe_toxins_max
|
||||
adjustToxLoss(min(ratio, MIN_PLASMA_DAMAGE)) //Limit amount of damage toxin exposure can do per second
|
||||
var/ratio = (breath.toxins/safe_toxins_max) * 10
|
||||
//adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) //Limit amount of damage toxin exposure can do per second
|
||||
if(reagents)
|
||||
reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
|
||||
toxins_alert = max(toxins_alert, 1)
|
||||
else
|
||||
toxins_alert = 0
|
||||
|
||||
@@ -348,7 +348,7 @@
|
||||
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>The [M.name] has [pick("bit","slashed")] []!</B>", src), 1)
|
||||
O.show_message(text("\red <B>The [M.name] glomps []!</B>", src), 1)
|
||||
|
||||
var/damage = rand(1, 3)
|
||||
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
adjustCloneLoss(damage/(blocked+1))
|
||||
if(HALLOSS)
|
||||
adjustHalLoss(damage/(blocked+1))
|
||||
UpdateDamageIcon()
|
||||
updatehealth()
|
||||
return 1
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ var/list/ai_list = list()
|
||||
anchored = 1 // -- TLE
|
||||
density = 1
|
||||
status_flags = CANSTUN|CANPARALYSE
|
||||
var/network = "SS13"
|
||||
var/list/network = list("SS13")
|
||||
var/obj/machinery/camera/current = null
|
||||
var/list/connected_robots = list()
|
||||
var/aiRestorePowerRoutine = 0
|
||||
@@ -580,15 +580,12 @@ var/list/ai_list = list()
|
||||
for (var/obj/machinery/camera/C in cameranet.cameras)
|
||||
if(!C.can_use())
|
||||
continue
|
||||
if(C.network == "AI Satellite")
|
||||
if (ticker.mode.name == "AI malfunction")
|
||||
var/datum/game_mode/malfunction/malf = ticker.mode
|
||||
for (var/datum/mind/M in malf.malf_ai)
|
||||
if (mind == M)
|
||||
cameralist[C.network] = C.network
|
||||
else
|
||||
if(C.network != "CREED" && C.network != "thunder" && C.network != "RD" && C.network != "toxins" && C.network != "Prison")
|
||||
cameralist[C.network] = C.network
|
||||
|
||||
var/list/tempnetwork = C.network
|
||||
tempnetwork.Remove("CREED", "thunder", "RD", "toxins", "Prison")
|
||||
if(tempnetwork.len)
|
||||
for(var/i in C.network)
|
||||
cameralist[i] = i
|
||||
var/old_network = network
|
||||
network = input(U, "Which network would you like to view?") as null|anything in cameralist
|
||||
|
||||
@@ -602,7 +599,7 @@ var/list/ai_list = list()
|
||||
for(var/obj/machinery/camera/C in cameranet.cameras)
|
||||
if(!C.can_use())
|
||||
continue
|
||||
if(C.network == network)
|
||||
if(network in C.network)
|
||||
U.eyeobj.setLoc(get_turf(C))
|
||||
break
|
||||
src << "\blue Switched to [network] camera network."
|
||||
|
||||
@@ -219,7 +219,7 @@
|
||||
src.unset_machine()
|
||||
src.reset_view(null)
|
||||
return 0
|
||||
if (stat == 2 || !C.status || C.network != src.network) return 0
|
||||
if (stat == 2 || !C.status || !(src.network in C.network)) return 0
|
||||
|
||||
// ok, we're alive, camera is good and in our network...
|
||||
|
||||
@@ -254,7 +254,7 @@
|
||||
if(!C.status)
|
||||
continue
|
||||
else
|
||||
if(C.network != "CREED" && C.network != "thunder" && C.network != "RD" && C.network != "toxins" && C.network != "Prison")
|
||||
if(C.network != "CREED" && C.network != "thunder" && C.network != "RD" && C.network != "toxins" && C.network != "Prison") COMPILE ERROR! This will have to be updated as camera.network is no longer a string, but a list instead
|
||||
cameralist[C.network] = C.network
|
||||
|
||||
src.network = input(usr, "Which network would you like to view?") as null|anything in cameralist
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
if(!scrambledcodes && !camera)
|
||||
camera = new /obj/machinery/camera(src)
|
||||
camera.c_tag = real_name
|
||||
camera.network = "SS13"
|
||||
camera.network = list("SS13")
|
||||
if(isWireCut(5)) // 5 = BORG CAMERA
|
||||
camera.status = 0
|
||||
..()
|
||||
@@ -652,7 +652,7 @@
|
||||
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>The [M.name] has [pick("bit","slashed")] []!</B>", src), 1)
|
||||
O.show_message(text("\red <B>The [M.name] glomps []!</B>", src), 1)
|
||||
|
||||
var/damage = rand(1, 3)
|
||||
|
||||
@@ -782,7 +782,7 @@
|
||||
if(icon_state =="mopgearrex")
|
||||
overlays.Cut()
|
||||
overlays += "eyes-mopgearrex"
|
||||
if(icon_state =="Miner")
|
||||
if(icon_state =="Miner" || icon_state =="Miner+j")
|
||||
overlays.Cut()
|
||||
overlays += "eyes-Miner"
|
||||
else
|
||||
@@ -855,7 +855,8 @@
|
||||
|
||||
if (href_list["mod"])
|
||||
var/obj/item/O = locate(href_list["mod"])
|
||||
O.attack_self(src)
|
||||
if (O)
|
||||
O.attack_self(src)
|
||||
|
||||
if (href_list["act"])
|
||||
var/obj/item/O = locate(href_list["act"])
|
||||
|
||||
@@ -18,13 +18,17 @@
|
||||
return
|
||||
|
||||
if (length(message) >= 2)
|
||||
if ((copytext(message, 1, 3) == ":b") || (copytext(message, 1, 3) == ":B"))
|
||||
if ((copytext(message, 1, 3) == ":b") || (copytext(message, 1, 3) == ":B") || \
|
||||
(copytext(message, 1, 3) == "#b") || (copytext(message, 1, 3) == "#B") || \
|
||||
(copytext(message, 1, 3) == ".b") || (copytext(message, 1, 3) == ".B"))
|
||||
if(istype(src, /mob/living/silicon/pai))
|
||||
return ..(message)
|
||||
message = copytext(message, 3)
|
||||
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
|
||||
robot_talk(message)
|
||||
else if (isAI(src) && ((copytext(message, 1, 3) == ":h") || (copytext(message, 1, 3) == ":H")))
|
||||
else if ((copytext(message, 1, 3) == ":h") || (copytext(message, 1, 3) == ":H") || \
|
||||
(copytext(message, 1, 3) == "#h") || (copytext(message, 1, 3) == "#H") || \
|
||||
(copytext(message, 1, 3) == ".h") || (copytext(message, 1, 3) == ".H"))
|
||||
if(isAI(src)&&client)//For patching directly into AI holopads.
|
||||
var/mob/living/silicon/ai/U = src
|
||||
message = copytext(message, 3)
|
||||
|
||||
@@ -1,209 +0,0 @@
|
||||
#define CLOWN_STANCE_IDLE 1
|
||||
#define CLOWN_STANCE_ATTACK 2
|
||||
#define CLOWN_STANCE_ATTACKING 3
|
||||
|
||||
/mob/living/simple_animal/clown
|
||||
name = "Clown"
|
||||
desc = "A denizen of clown planet"
|
||||
icon_state = "clown"
|
||||
icon_living = "clown"
|
||||
icon_dead = "clown_dead"
|
||||
icon_gib = "clown_gib"
|
||||
speak_chance = 0
|
||||
turns_per_move = 5
|
||||
response_help = "pokes the"
|
||||
response_disarm = "gently pushes aside the"
|
||||
response_harm = "hits the"
|
||||
speak = list("HONK", "Honk!", "Welcome to clown planet!")
|
||||
emote_see = list("honks")
|
||||
speak_chance = 1
|
||||
a_intent = "harm"
|
||||
stop_automated_movement_when_pulled = 0
|
||||
maxHealth = 75
|
||||
health = 75
|
||||
speed = -1
|
||||
harm_intent_damage = 8
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 10
|
||||
attacktext = "attacks"
|
||||
attack_sound = 'sound/items/bikehorn.ogg'
|
||||
|
||||
min_oxy = 5
|
||||
max_oxy = 0
|
||||
min_tox = 0
|
||||
max_tox = 1
|
||||
min_co2 = 0
|
||||
max_co2 = 5
|
||||
min_n2 = 0
|
||||
max_n2 = 0
|
||||
minbodytemp = 270
|
||||
maxbodytemp = 370
|
||||
heat_damage_per_tick = 15 //amount of damage applied if animal's body temperature is higher than maxbodytemp
|
||||
cold_damage_per_tick = 10 //same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp
|
||||
unsuitable_atoms_damage = 10
|
||||
|
||||
var/hostile = 0
|
||||
|
||||
var/stance = CLOWN_STANCE_IDLE //Used to determine behavior
|
||||
var/mob/living/target_mob
|
||||
|
||||
/mob/living/simple_animal/clown/Life()
|
||||
..()
|
||||
if(stat == 2)
|
||||
new /obj/effect/landmark/mobcorpse/clown (src.loc)
|
||||
del src
|
||||
return
|
||||
|
||||
if(health > maxHealth)
|
||||
health = maxHealth
|
||||
|
||||
if(!ckey && !stop_automated_movement)
|
||||
if(isturf(src.loc) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc.
|
||||
turns_since_move++
|
||||
if(turns_since_move >= turns_per_move)
|
||||
if(!(stop_automated_movement_when_pulled && pulledby)) //Soma animals don't move when pulled
|
||||
Move(get_step(src,pick(cardinal)))
|
||||
turns_since_move = 0
|
||||
|
||||
if(!stat)
|
||||
switch(stance)
|
||||
if(CLOWN_STANCE_IDLE)
|
||||
if (src.hostile == 0) return
|
||||
for(var/atom/A in view(7,src))
|
||||
if(isclown(A))
|
||||
continue
|
||||
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
if(!L.stat)
|
||||
stance = CLOWN_STANCE_ATTACK
|
||||
target_mob = L
|
||||
break
|
||||
|
||||
if(istype(A, /obj/mecha))
|
||||
var/obj/mecha/M = A
|
||||
if (M.occupant)
|
||||
stance = CLOWN_STANCE_ATTACK
|
||||
target_mob = M
|
||||
break
|
||||
if (target_mob)
|
||||
emote("honks menacingly at [target_mob]")
|
||||
|
||||
if(CLOWN_STANCE_ATTACK) //This one should only be active for one tick
|
||||
stop_automated_movement = 1
|
||||
if(!target_mob || SA_attackable(target_mob))
|
||||
stance = CLOWN_STANCE_IDLE
|
||||
if(target_mob in view(7,src))
|
||||
walk_to(src, target_mob, 1, 3)
|
||||
stance = CLOWN_STANCE_ATTACKING
|
||||
|
||||
if(CLOWN_STANCE_ATTACKING)
|
||||
stop_automated_movement = 1
|
||||
if(!target_mob || SA_attackable(target_mob))
|
||||
stance = CLOWN_STANCE_IDLE
|
||||
target_mob = null
|
||||
return
|
||||
if(!(target_mob in view(7,src)))
|
||||
stance = CLOWN_STANCE_IDLE
|
||||
target_mob = null
|
||||
return
|
||||
if(get_dist(src, target_mob) <= 1) //Attacking
|
||||
if(isliving(target_mob))
|
||||
var/mob/living/L = target_mob
|
||||
L.attack_animal(src)
|
||||
if(prob(10))
|
||||
L.Weaken(5)
|
||||
L.visible_message("<span class='danger'>\the [src] slips \the [L]!</span>")
|
||||
for(var/mob/H in viewers(src, null))
|
||||
if(istype(H, /mob/living/simple_animal/clown))
|
||||
var/mob/living/simple_animal/clown/C = H
|
||||
C.hostile = 1
|
||||
if(istype(target_mob,/obj/mecha))
|
||||
var/obj/mecha/M = target_mob
|
||||
M.attack_animal(src)
|
||||
for(var/mob/H in viewers(src, null))
|
||||
if(istype(H, /mob/living/simple_animal/clown))
|
||||
var/mob/living/simple_animal/clown/C = H
|
||||
C.hostile = 1
|
||||
|
||||
/mob/living/simple_animal/clown/bullet_act(var/obj/item/projectile/Proj)
|
||||
..()
|
||||
hostile = 1
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if(istype(M, /mob/living/simple_animal/clown))
|
||||
var/mob/living/simple_animal/clown/C = M
|
||||
C.hostile = 1
|
||||
return 0
|
||||
|
||||
|
||||
/mob/living/simple_animal/clown/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
..()
|
||||
hostile = 1
|
||||
for(var/mob/Z in viewers(src, null))
|
||||
if(istype(Z, /mob/living/simple_animal/clown))
|
||||
var/mob/living/simple_animal/clown/C = Z
|
||||
C.hostile = 1
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/clown/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
|
||||
..()
|
||||
hostile = 1
|
||||
for(var/mob/Z in viewers(src, null))
|
||||
if(istype(Z, /mob/living/simple_animal/clown))
|
||||
var/mob/living/simple_animal/clown/C = Z
|
||||
C.hostile = 1
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/clown/attack_hand(mob/living/carbon/human/M as mob)
|
||||
..()
|
||||
hostile = 1
|
||||
for(var/mob/Z in viewers(src, null))
|
||||
if(istype(Z, /mob/living/simple_animal/clown))
|
||||
var/mob/living/simple_animal/clown/C = Z
|
||||
C.hostile = 1
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/clown/attack_animal(mob/living/simple_animal/M as mob)
|
||||
..()
|
||||
hostile = 1
|
||||
for(var/mob/Z in viewers(src, null))
|
||||
if(istype(Z, /mob/living/simple_animal/clown))
|
||||
var/mob/living/simple_animal/clown/C = Z
|
||||
C.hostile = 1
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/clown/Bump(atom/movable/AM as mob|obj, yes)
|
||||
|
||||
spawn( 0 )
|
||||
if ((!( yes ) || now_pushing))
|
||||
return
|
||||
now_pushing = 1
|
||||
if(ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
|
||||
if(prob(50))
|
||||
src << "\red <B>You fail to push [tmob]'s fat ass out of the way.</B>"
|
||||
now_pushing = 0
|
||||
return
|
||||
if(!(tmob.status_flags & CANPUSH))
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
tmob.LAssailant = src
|
||||
now_pushing = 0
|
||||
..()
|
||||
if (!( istype(AM, /atom/movable) ))
|
||||
return
|
||||
if (!( now_pushing ))
|
||||
now_pushing = 1
|
||||
if (!( AM.anchored ))
|
||||
var/t = get_dir(src, AM)
|
||||
if (istype(AM, /obj/structure/window))
|
||||
if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
|
||||
for(var/obj/structure/window/win in get_step(AM,t))
|
||||
now_pushing = 0
|
||||
return
|
||||
step(AM, t)
|
||||
now_pushing = null
|
||||
return
|
||||
return
|
||||
263
code/modules/mob/living/simple_animal/friendly/farm_animals.dm
Normal file
263
code/modules/mob/living/simple_animal/friendly/farm_animals.dm
Normal file
@@ -0,0 +1,263 @@
|
||||
//goat
|
||||
/mob/living/simple_animal/hostile/retaliate/goat
|
||||
name = "goat"
|
||||
desc = "Not known for their pleasant disposition."
|
||||
icon_state = "goat"
|
||||
icon_living = "goat"
|
||||
icon_dead = "goat_dead"
|
||||
speak = list("EHEHEHEHEH","eh?")
|
||||
speak_emote = list("brays")
|
||||
emote_hear = list("brays")
|
||||
emote_see = list("shakes its head", "stamps a foot", "glares around")
|
||||
speak_chance = 1
|
||||
turns_per_move = 5
|
||||
see_in_dark = 6
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
|
||||
meat_amount = 4
|
||||
response_help = "pets the"
|
||||
response_disarm = "gently pushes aside the"
|
||||
response_harm = "kicks the"
|
||||
faction = "goat"
|
||||
attacktext = "kicks"
|
||||
health = 40
|
||||
melee_damage_lower = 1
|
||||
melee_damage_upper = 5
|
||||
var/datum/reagents/udder = null
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/goat/New()
|
||||
udder = new(50)
|
||||
udder.my_atom = src
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/goat/Life()
|
||||
. = ..()
|
||||
if(.)
|
||||
//chance to go crazy and start wacking stuff
|
||||
if(!enemies.len && prob(1))
|
||||
Retaliate()
|
||||
|
||||
if(enemies.len && prob(10))
|
||||
enemies = list()
|
||||
LoseTarget()
|
||||
src.visible_message("\blue [src] calms down.")
|
||||
|
||||
if(stat == CONSCIOUS)
|
||||
if(udder && prob(5))
|
||||
udder.add_reagent("milk", rand(5, 10))
|
||||
|
||||
if(locate(/obj/effect/spacevine) in loc)
|
||||
var/obj/effect/spacevine/SV = locate(/obj/effect/spacevine) in loc
|
||||
del(SV)
|
||||
if(prob(10))
|
||||
say("Nom")
|
||||
|
||||
if(!pulledby)
|
||||
for(var/direction in shuffle(list(1,2,4,8,5,6,9,10)))
|
||||
var/step = get_step(src, direction)
|
||||
if(step)
|
||||
if(locate(/obj/effect/spacevine) in step)
|
||||
Move(step)
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/goat/Retaliate()
|
||||
..()
|
||||
src.visible_message("\red [src] gets an evil-looking gleam in their eye.")
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/goat/Move()
|
||||
..()
|
||||
if(!stat)
|
||||
if(locate(/obj/effect/spacevine) in loc)
|
||||
var/obj/effect/spacevine/SV = locate(/obj/effect/spacevine) in loc
|
||||
del(SV)
|
||||
if(prob(10))
|
||||
say("Nom")
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/goat/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(stat == CONSCIOUS && istype(O, /obj/item/weapon/reagent_containers/glass))
|
||||
user.visible_message("<span class='notice'>[user] milks [src] using \the [O].</span>")
|
||||
var/obj/item/weapon/reagent_containers/glass/G = O
|
||||
var/transfered = udder.trans_id_to(G, "milk", rand(5,10))
|
||||
if(G.reagents.total_volume >= G.volume)
|
||||
user << "\red The [O] is full."
|
||||
if(!transfered)
|
||||
user << "\red The udder is dry. Wait a bit longer..."
|
||||
else
|
||||
..()
|
||||
//cow
|
||||
/mob/living/simple_animal/cow
|
||||
name = "cow"
|
||||
desc = "Known for their milk, just don't tip them over."
|
||||
icon_state = "cow"
|
||||
icon_living = "cow"
|
||||
icon_dead = "cow_dead"
|
||||
icon_gib = "cow_gib"
|
||||
speak = list("moo?","moo","MOOOOOO")
|
||||
speak_emote = list("moos","moos hauntingly")
|
||||
emote_hear = list("brays")
|
||||
emote_see = list("shakes its head")
|
||||
speak_chance = 1
|
||||
turns_per_move = 5
|
||||
see_in_dark = 6
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
|
||||
meat_amount = 6
|
||||
response_help = "pets the"
|
||||
response_disarm = "gently pushes aside the"
|
||||
response_harm = "kicks the"
|
||||
attacktext = "kicks"
|
||||
health = 50
|
||||
var/datum/reagents/udder = null
|
||||
|
||||
/mob/living/simple_animal/cow/New()
|
||||
udder = new(50)
|
||||
udder.my_atom = src
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/cow/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(stat == CONSCIOUS && istype(O, /obj/item/weapon/reagent_containers/glass))
|
||||
user.visible_message("<span class='notice'>[user] milks [src] using \the [O].</span>")
|
||||
var/obj/item/weapon/reagent_containers/glass/G = O
|
||||
var/transfered = udder.trans_id_to(G, "milk", rand(5,10))
|
||||
if(G.reagents.total_volume >= G.volume)
|
||||
user << "\red The [O] is full."
|
||||
if(!transfered)
|
||||
user << "\red The udder is dry. Wait a bit longer..."
|
||||
else
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/cow/Life()
|
||||
. = ..()
|
||||
if(stat == CONSCIOUS)
|
||||
if(udder && prob(5))
|
||||
udder.add_reagent("milk", rand(5, 10))
|
||||
|
||||
/mob/living/simple_animal/cow/attack_hand(mob/living/carbon/M as mob)
|
||||
if(!stat && M.a_intent == "disarm" && icon_state != icon_dead)
|
||||
M.visible_message("<span class='warning'>[M] tips over [src].</span>","<span class='notice'>You tip over [src].</span>")
|
||||
Weaken(30)
|
||||
icon_state = icon_dead
|
||||
spawn(rand(20,50))
|
||||
if(!stat && M)
|
||||
icon_state = icon_living
|
||||
var/list/responses = list( "[src] looks at you imploringly.",
|
||||
"[src] looks at you pleadingly",
|
||||
"[src] looks at you with a resigned expression.",
|
||||
"[src] seems resigned to it's fate.")
|
||||
M << pick(responses)
|
||||
else
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/chick
|
||||
name = "\improper chick"
|
||||
desc = "Adorable! They make such a racket though."
|
||||
icon_state = "chick"
|
||||
icon_living = "chick"
|
||||
icon_dead = "chick_dead"
|
||||
icon_gib = "chick_gib"
|
||||
speak = list("Cherp.","Cherp?","Chirrup.","Cheep!")
|
||||
speak_emote = list("cheeps")
|
||||
emote_hear = list("cheeps")
|
||||
emote_see = list("pecks at the ground","flaps its tiny wings")
|
||||
speak_chance = 2
|
||||
turns_per_move = 2
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
|
||||
meat_amount = 1
|
||||
response_help = "pets the"
|
||||
response_disarm = "gently pushes aside the"
|
||||
response_harm = "kicks the"
|
||||
attacktext = "kicks"
|
||||
health = 1
|
||||
var/amount_grown = 0
|
||||
pass_flags = PASSTABLE | PASSGRILLE
|
||||
|
||||
/mob/living/simple_animal/chick/New()
|
||||
..()
|
||||
pixel_x = rand(-6, 6)
|
||||
pixel_y = rand(0, 10)
|
||||
|
||||
/mob/living/simple_animal/chick/Life()
|
||||
. =..()
|
||||
if(!.)
|
||||
return
|
||||
if(!stat)
|
||||
amount_grown += rand(1,2)
|
||||
if(amount_grown >= 100)
|
||||
new /mob/living/simple_animal/chicken(src.loc)
|
||||
del(src)
|
||||
|
||||
var/const/MAX_CHICKENS = 50
|
||||
var/global/chicken_count = 0
|
||||
|
||||
/mob/living/simple_animal/chicken
|
||||
name = "\improper chicken"
|
||||
desc = "Hopefully the eggs are good this season."
|
||||
icon_state = "chicken"
|
||||
icon_living = "chicken"
|
||||
icon_dead = "chicken_dead"
|
||||
speak = list("Cluck!","BWAAAAARK BWAK BWAK BWAK!","Bwaak bwak.")
|
||||
speak_emote = list("clucks","croons")
|
||||
emote_hear = list("clucks")
|
||||
emote_see = list("pecks at the ground","flaps its wings viciously")
|
||||
speak_chance = 2
|
||||
turns_per_move = 3
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
|
||||
meat_amount = 2
|
||||
response_help = "pets the"
|
||||
response_disarm = "gently pushes aside the"
|
||||
response_harm = "kicks the"
|
||||
attacktext = "kicks"
|
||||
health = 10
|
||||
var/eggsleft = 0
|
||||
var/color
|
||||
pass_flags = PASSTABLE
|
||||
|
||||
/mob/living/simple_animal/chicken/New()
|
||||
..()
|
||||
if(!color)
|
||||
color = pick( list("brown","black","white") )
|
||||
icon_state = "chicken_[color]"
|
||||
icon_living = "chicken_[color]"
|
||||
icon_dead = "chicken_[color]_dead"
|
||||
pixel_x = rand(-6, 6)
|
||||
pixel_y = rand(0, 10)
|
||||
chicken_count += 1
|
||||
|
||||
/mob/living/simple_animal/chicken/Die()
|
||||
..()
|
||||
chicken_count -= 1
|
||||
|
||||
/mob/living/simple_animal/chicken/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/wheat)) //feedin' dem chickens
|
||||
if(!stat && eggsleft < 8)
|
||||
user.visible_message("\blue [user] feeds [O] to [name]! It clucks happily.","\blue You feed [O] to [name]! It clucks happily.")
|
||||
user.drop_item()
|
||||
del(O)
|
||||
eggsleft += rand(1, 4)
|
||||
//world << eggsleft
|
||||
else
|
||||
user << "\blue [name] doesn't seem hungry!"
|
||||
else
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/chicken/Life()
|
||||
. =..()
|
||||
if(!.)
|
||||
return
|
||||
if(!stat && prob(3) && eggsleft > 0)
|
||||
visible_message("[src] [pick("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.")]")
|
||||
eggsleft--
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/egg/E = new(get_turf(src))
|
||||
E.pixel_x = rand(-6,6)
|
||||
E.pixel_y = rand(-6,6)
|
||||
if(chicken_count < MAX_CHICKENS && prob(10))
|
||||
processing_objects.Add(E)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/egg/var/amount_grown = 0
|
||||
/obj/item/weapon/reagent_containers/food/snacks/egg/process()
|
||||
if(isturf(loc))
|
||||
amount_grown += rand(1,2)
|
||||
if(amount_grown >= 100)
|
||||
visible_message("[src] hatches with a quiet cracking sound.")
|
||||
new /mob/living/simple_animal/chick(get_turf(src))
|
||||
processing_objects.Remove(src)
|
||||
del(src)
|
||||
else
|
||||
processing_objects.Remove(src)
|
||||
@@ -65,18 +65,20 @@
|
||||
emote_see = list("jiggles", "bounces in place")
|
||||
var/colour = "grey"
|
||||
|
||||
/mob/living/simple_animal/slime/adult/Die()
|
||||
/mob/living/simple_animal/adultslime/New()
|
||||
..()
|
||||
overlays += "aslime-:33"
|
||||
|
||||
|
||||
/mob/living/simple_animal/slime/adult/Die()
|
||||
var/mob/living/simple_animal/slime/S1 = new /mob/living/simple_animal/slime (src.loc)
|
||||
S1.icon_state = "[src.colour] baby slime"
|
||||
S1.icon_state = "[src.colour] adult slime"
|
||||
S1.icon_living = "[src.colour] adult slime"
|
||||
S1.icon_dead = "[src.colour] adult slime dead"
|
||||
S1.icon_living = "[src.colour] baby slime"
|
||||
S1.icon_dead = "[src.colour] baby slime dead"
|
||||
S1.colour = "[src.colour]"
|
||||
var/mob/living/simple_animal/slime/S2 = new /mob/living/simple_animal/slime (src.loc)
|
||||
S2.icon_state = "[src.colour] baby slime"
|
||||
S2.icon_state = "[src.colour] adult slime"
|
||||
S2.icon_living = "[src.colour] adult slime"
|
||||
S2.icon_dead = "[src.colour] adult slime dead"
|
||||
S2.icon_living = "[src.colour] baby slime"
|
||||
S2.icon_dead = "[src.colour] baby slime dead"
|
||||
S2.colour = "[src.colour]"
|
||||
del(src)
|
||||
201
code/modules/mob/living/simple_animal/hostile/giant_spider.dm
Normal file
201
code/modules/mob/living/simple_animal/hostile/giant_spider.dm
Normal file
@@ -0,0 +1,201 @@
|
||||
|
||||
#define SPINNING_WEB 1
|
||||
#define LAYING_EGGS 2
|
||||
#define MOVING_TO_TARGET 3
|
||||
#define SPINNING_COCOON 4
|
||||
|
||||
//basic spider mob, these generally guard nests
|
||||
/mob/living/simple_animal/hostile/giant_spider
|
||||
name = "giant spider"
|
||||
desc = "Furry and black, it makes you shudder to look at it. This one has deep red eyes."
|
||||
icon_state = "guard"
|
||||
icon_living = "guard"
|
||||
icon_dead = "guard_dead"
|
||||
speak_emote = list("chitters")
|
||||
emote_hear = list("chitters")
|
||||
speak_chance = 5
|
||||
turns_per_move = 5
|
||||
see_in_dark = 10
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/bearmeat
|
||||
response_help = "pets the"
|
||||
response_disarm = "gently pushes aside the"
|
||||
response_harm = "pokes the"
|
||||
stop_automated_movement_when_pulled = 0
|
||||
maxHealth = 200
|
||||
health = 200
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 20
|
||||
heat_damage_per_tick = 20
|
||||
cold_damage_per_tick = 20
|
||||
var/poison_per_bite = 5
|
||||
var/poison_type = "toxin"
|
||||
faction = "spiders"
|
||||
var/busy = 0
|
||||
pass_flags = PASSTABLE
|
||||
move_to_delay = 6
|
||||
|
||||
//nursemaids - these create webs and eggs
|
||||
/mob/living/simple_animal/hostile/giant_spider/nurse
|
||||
desc = "Furry and black, it makes you shudder to look at it. This one has brilliant green eyes."
|
||||
icon_state = "nurse"
|
||||
icon_living = "nurse"
|
||||
icon_dead = "nurse_dead"
|
||||
maxHealth = 40
|
||||
health = 40
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 10
|
||||
poison_per_bite = 10
|
||||
var/atom/cocoon_target
|
||||
poison_type = "stoxin"
|
||||
var/fed = 0
|
||||
|
||||
//hunters have the most poison and move the fastest, so they can find prey
|
||||
/mob/living/simple_animal/hostile/giant_spider/hunter
|
||||
desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes."
|
||||
icon_state = "hunter"
|
||||
icon_living = "hunter"
|
||||
icon_dead = "hunter_dead"
|
||||
maxHealth = 120
|
||||
health = 120
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 20
|
||||
poison_per_bite = 5
|
||||
move_to_delay = 4
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/AttackingTarget()
|
||||
..()
|
||||
if(isliving(target_mob))
|
||||
var/mob/living/L = target_mob
|
||||
if(L.reagents)
|
||||
L.reagents.add_reagent("toxin", poison_per_bite)
|
||||
if(prob(poison_per_bite))
|
||||
L << "\red You feel a tiny prick."
|
||||
L.reagents.add_reagent(poison_type, 5)
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/Life()
|
||||
..()
|
||||
if(!stat)
|
||||
if(stance == HOSTILE_STANCE_IDLE)
|
||||
//1% chance to skitter madly away
|
||||
if(!busy && prob(1))
|
||||
/*var/list/move_targets = list()
|
||||
for(var/turf/T in orange(20, src))
|
||||
move_targets.Add(T)*/
|
||||
stop_automated_movement = 1
|
||||
walk_to(src, pick(orange(20, src)), 1, move_to_delay)
|
||||
spawn(50)
|
||||
stop_automated_movement = 0
|
||||
walk(src,0)
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/nurse/proc/GiveUp(var/C)
|
||||
spawn(100)
|
||||
if(busy == MOVING_TO_TARGET)
|
||||
if(cocoon_target == C && get_dist(src,cocoon_target) > 1)
|
||||
cocoon_target = null
|
||||
busy = 0
|
||||
stop_automated_movement = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/nurse/Life()
|
||||
..()
|
||||
if(!stat)
|
||||
if(stance == HOSTILE_STANCE_IDLE)
|
||||
var/list/can_see = ListTargets()
|
||||
//30% chance to stop wandering and do something
|
||||
if(!busy && prob(30))
|
||||
//first, check for potential food nearby to cocoon
|
||||
for(var/mob/living/C in can_see)
|
||||
if(C.stat)
|
||||
cocoon_target = C
|
||||
busy = MOVING_TO_TARGET
|
||||
walk_to(src, C, 1, move_to_delay)
|
||||
//give up if we can't reach them after 10 seconds
|
||||
GiveUp(C)
|
||||
return
|
||||
|
||||
//second, spin a sticky spiderweb on this tile
|
||||
var/obj/effect/spider/stickyweb/W = locate() in get_turf(src)
|
||||
if(!W)
|
||||
busy = SPINNING_WEB
|
||||
src.visible_message("\blue \the [src] begins to secrete a sticky substance.")
|
||||
stop_automated_movement = 1
|
||||
spawn(40)
|
||||
if(busy == SPINNING_WEB)
|
||||
new /obj/effect/spider/stickyweb(src.loc)
|
||||
busy = 0
|
||||
stop_automated_movement = 0
|
||||
else
|
||||
//third, lay an egg cluster there
|
||||
var/obj/effect/spider/eggcluster/E = locate() in get_turf(src)
|
||||
if(!E && fed > 0)
|
||||
busy = LAYING_EGGS
|
||||
src.visible_message("\blue \the [src] begins to lay a cluster of eggs.")
|
||||
stop_automated_movement = 1
|
||||
spawn(50)
|
||||
if(busy == LAYING_EGGS)
|
||||
E = locate() in get_turf(src)
|
||||
if(!E)
|
||||
new /obj/effect/spider/eggcluster(src.loc)
|
||||
fed--
|
||||
busy = 0
|
||||
stop_automated_movement = 0
|
||||
else
|
||||
//fourthly, cocoon any nearby items so those pesky pinkskins can't use them
|
||||
for(var/obj/O in can_see)
|
||||
|
||||
if(O.anchored)
|
||||
continue
|
||||
|
||||
if(istype(O, /obj/item) || istype(O, /obj/structure) || istype(O, /obj/machinery))
|
||||
cocoon_target = O
|
||||
busy = MOVING_TO_TARGET
|
||||
stop_automated_movement = 1
|
||||
walk_to(src, O, 1, move_to_delay)
|
||||
//give up if we can't reach them after 10 seconds
|
||||
GiveUp(O)
|
||||
|
||||
else if(busy == MOVING_TO_TARGET && cocoon_target)
|
||||
if(get_dist(src, cocoon_target) <= 1)
|
||||
busy = SPINNING_COCOON
|
||||
src.visible_message("\blue \the [src] begins to secrete a sticky substance around \the [cocoon_target].")
|
||||
stop_automated_movement = 1
|
||||
walk(src,0)
|
||||
spawn(50)
|
||||
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/mob/living/M in C.loc)
|
||||
if(istype(M, /mob/living/simple_animal/hostile/giant_spider))
|
||||
continue
|
||||
large_cocoon = 1
|
||||
fed++
|
||||
src.visible_message("\red \the [src] sticks a proboscis into \the [cocoon_target] and sucks a viscous substance out.")
|
||||
M.loc = C
|
||||
C.pixel_x = M.pixel_x
|
||||
C.pixel_y = M.pixel_y
|
||||
break
|
||||
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
|
||||
if(large_cocoon)
|
||||
C.icon_state = pick("cocoon_large1","cocoon_large2","cocoon_large3")
|
||||
busy = 0
|
||||
stop_automated_movement = 0
|
||||
|
||||
else
|
||||
busy = 0
|
||||
stop_automated_movement = 0
|
||||
|
||||
#undef SPINNING_WEB
|
||||
#undef LAYING_EGGS
|
||||
#undef MOVING_TO_TARGET
|
||||
#undef SPINNING_COCOON
|
||||
@@ -18,6 +18,11 @@
|
||||
stop_automated_movement = 0
|
||||
for(var/atom/A in ListTargets())
|
||||
|
||||
var/atom/F = Found(A)
|
||||
if(F)
|
||||
T = F
|
||||
break
|
||||
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
if(L.faction == src.faction && !attack_same)
|
||||
@@ -29,6 +34,7 @@
|
||||
stance = HOSTILE_STANCE_ATTACK
|
||||
T = L
|
||||
break
|
||||
|
||||
if(istype(A, /obj/mecha))
|
||||
var/obj/mecha/M = A
|
||||
if (M.occupant)
|
||||
@@ -37,6 +43,10 @@
|
||||
break
|
||||
return T
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/proc/Found(var/atom/A)
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/proc/MoveToTarget()
|
||||
stop_automated_movement = 1
|
||||
if(!target_mob || SA_attackable(target_mob))
|
||||
@@ -163,4 +173,4 @@
|
||||
for(var/dir in cardinal) // North, South, East, West
|
||||
var/obj/structure/obstacle = locate(/obj/structure, get_step(src, dir))
|
||||
if(istype(obstacle, /obj/structure/window) || istype(obstacle, /obj/structure/closet) || istype(obstacle, /obj/structure/table) || istype(obstacle, /obj/structure/grille))
|
||||
obstacle.attack_animal(src)
|
||||
obstacle.attack_animal(src)
|
||||
|
||||
@@ -133,13 +133,13 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
|
||||
|
||||
health = 100
|
||||
maxHealth = 100
|
||||
var/obj/item/staff = null // the staff that changed they, never attack the bearer of this staff
|
||||
var/mob/living/creator = null // the creator
|
||||
var/destroy_objects = 0
|
||||
var/knockdown_people = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/mimic/copy/New(loc, var/obj/copy, var/obj/item/staff)
|
||||
/mob/living/simple_animal/hostile/mimic/copy/New(loc, var/obj/copy, var/mob/living/creator)
|
||||
..(loc)
|
||||
CopyObject(copy, staff)
|
||||
CopyObject(copy, creator)
|
||||
|
||||
/mob/living/simple_animal/hostile/mimic/copy/Die()
|
||||
|
||||
@@ -148,10 +148,10 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/mimic/copy/ListTargets()
|
||||
// Return a list of targets that isn't the holder of our staff
|
||||
return view(src, 7) - get(staff, /mob)
|
||||
// Return a list of targets that isn't the creator
|
||||
return view(src, 7) - creator
|
||||
|
||||
/mob/living/simple_animal/hostile/mimic/copy/proc/CopyObject(var/obj/O, var/obj/item/staff)
|
||||
/mob/living/simple_animal/hostile/mimic/copy/proc/CopyObject(var/obj/O, var/mob/living/creator)
|
||||
|
||||
if((istype(O, /obj/item) || istype(O, /obj/structure)) && !is_type_in_list(O, protected_objects))
|
||||
|
||||
@@ -177,9 +177,9 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
|
||||
move_to_delay = 2 * I.w_class
|
||||
|
||||
maxHealth = health
|
||||
if(staff)
|
||||
src.staff = staff
|
||||
faction = "\ref[staff]" // very unique
|
||||
if(creator)
|
||||
src.creator = creator
|
||||
faction = "\ref[creator]" // very unique
|
||||
return 1
|
||||
return
|
||||
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
/mob/living/simple_animal/hostile/retaliate/clown
|
||||
name = "Clown"
|
||||
desc = "A denizen of clown planet"
|
||||
icon_state = "clown"
|
||||
icon_living = "clown"
|
||||
icon_dead = "clown_dead"
|
||||
icon_gib = "clown_gib"
|
||||
speak_chance = 0
|
||||
turns_per_move = 5
|
||||
response_help = "pokes the"
|
||||
response_disarm = "gently pushes aside the"
|
||||
response_harm = "hits the"
|
||||
speak = list("HONK", "Honk!", "Welcome to clown planet!")
|
||||
emote_see = list("honks")
|
||||
speak_chance = 1
|
||||
a_intent = "harm"
|
||||
stop_automated_movement_when_pulled = 0
|
||||
maxHealth = 75
|
||||
health = 75
|
||||
speed = -1
|
||||
harm_intent_damage = 8
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 10
|
||||
attacktext = "attacks"
|
||||
attack_sound = 'sound/items/bikehorn.ogg'
|
||||
|
||||
min_oxy = 5
|
||||
max_oxy = 0
|
||||
min_tox = 0
|
||||
max_tox = 1
|
||||
min_co2 = 0
|
||||
max_co2 = 5
|
||||
min_n2 = 0
|
||||
max_n2 = 0
|
||||
minbodytemp = 270
|
||||
maxbodytemp = 370
|
||||
heat_damage_per_tick = 15 //amount of damage applied if animal's body temperature is higher than maxbodytemp
|
||||
cold_damage_per_tick = 10 //same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp
|
||||
unsuitable_atoms_damage = 10
|
||||
@@ -0,0 +1,49 @@
|
||||
/mob/living/simple_animal/hostile/retaliate
|
||||
var/list/enemies = list()
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/Found(var/atom/A)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
if(!L.stat)
|
||||
stance = HOSTILE_STANCE_ATTACK
|
||||
return L
|
||||
else
|
||||
enemies -= L
|
||||
else if(istype(A, /obj/mecha))
|
||||
var/obj/mecha/M = A
|
||||
if(M.occupant)
|
||||
stance = HOSTILE_STANCE_ATTACK
|
||||
return A
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/ListTargets()
|
||||
if(!enemies.len)
|
||||
return list()
|
||||
var/list/see = ..()
|
||||
see &= enemies // Remove all entries that aren't in enemies
|
||||
return see
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/proc/Retaliate()
|
||||
..()
|
||||
var/list/around = view(src, 7)
|
||||
|
||||
for(var/atom/movable/A in around)
|
||||
if(A == src)
|
||||
continue
|
||||
if(isliving(A))
|
||||
var/mob/living/M = A
|
||||
if(!attack_same && M.faction != faction)
|
||||
enemies |= M
|
||||
else if(istype(A, /obj/mecha))
|
||||
var/obj/mecha/M = A
|
||||
if(M.occupant)
|
||||
enemies |= M
|
||||
enemies |= M.occupant
|
||||
|
||||
for(var/mob/living/simple_animal/hostile/retaliate/H in around)
|
||||
if(!attack_same && !H.attack_same && H.faction == faction)
|
||||
H.enemies |= enemies
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/adjustBruteLoss(var/damage)
|
||||
..(damage)
|
||||
Retaliate()
|
||||
@@ -339,6 +339,28 @@
|
||||
L.amount_grown = min(L.amount_grown + damage, L.max_grown)
|
||||
|
||||
|
||||
/mob/living/simple_animal/attack_slime(mob/living/carbon/slime/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
|
||||
if(M.Victim) return // can't attack while eating!
|
||||
|
||||
visible_message("\red <B>The [M.name] glomps [src]!</B>")
|
||||
|
||||
var/damage = rand(1, 3)
|
||||
|
||||
if(istype(src, /mob/living/carbon/slime/adult))
|
||||
damage = rand(20, 40)
|
||||
else
|
||||
damage = rand(5, 35)
|
||||
|
||||
adjustBruteLoss(damage)
|
||||
|
||||
|
||||
return
|
||||
|
||||
|
||||
/mob/living/simple_animal/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
|
||||
if(istype(O, /obj/item/stack/medical))
|
||||
|
||||
|
||||
@@ -145,9 +145,6 @@
|
||||
var/list/mutations = list() //Carbon -- Doohl
|
||||
//see: setup.dm for list of mutations
|
||||
|
||||
var/list/augmentations = list() //Carbon -- Doohl
|
||||
//see: setup.dm for list of augmentations
|
||||
|
||||
var/voice_name = "unidentifiable voice"
|
||||
var/voice_message = null // When you are not understood by others (replaced with just screeches, hisses, chimpers etc.)
|
||||
var/say_message = null // When you are understood by others. Currently only used by aliens and monkeys in their say_quote procs
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
return 0
|
||||
|
||||
/proc/isclown(A)
|
||||
if(istype(A, /mob/living/simple_animal/clown))
|
||||
if(istype(A, /mob/living/simple_animal/hostile/retaliate/clown))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
@@ -259,6 +259,7 @@
|
||||
if(!job) return 0
|
||||
if((job.current_positions >= job.total_positions) && job.total_positions != -1) return 0
|
||||
if(jobban_isbanned(src,rank)) return 0
|
||||
if(!job.player_old_enough(src.client)) return 0
|
||||
return 1
|
||||
|
||||
|
||||
|
||||
@@ -9,12 +9,19 @@
|
||||
/mob/verb/say_verb(message as text)
|
||||
set name = "Say"
|
||||
set category = "IC"
|
||||
if(say_disabled) //This is here to try to identify lag problems
|
||||
usr << "\red Speech is currently admin-disabled."
|
||||
return
|
||||
usr.say(message)
|
||||
|
||||
/mob/verb/me_verb(message as text)
|
||||
set name = "Me"
|
||||
set category = "IC"
|
||||
|
||||
if(say_disabled) //This is here to try to identify lag problems
|
||||
usr << "\red Speech is currently admin-disabled."
|
||||
return
|
||||
|
||||
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
|
||||
|
||||
if(ishuman(src) || isrobot(src))
|
||||
@@ -26,6 +33,10 @@
|
||||
var/name = src.real_name
|
||||
var/alt_name = ""
|
||||
|
||||
if(say_disabled) //This is here to try to identify lag problems
|
||||
usr << "\red Speech is currently admin-disabled."
|
||||
return
|
||||
|
||||
if(mind && mind.name)
|
||||
name = "[mind.name]"
|
||||
else
|
||||
|
||||
@@ -460,12 +460,6 @@
|
||||
usr:inv3.icon_state = "inv3"
|
||||
usr:module_active = null
|
||||
|
||||
if("radar")
|
||||
usr:close_radar()
|
||||
|
||||
if("radar closed")
|
||||
usr:start_radar()
|
||||
|
||||
else
|
||||
DblClick()
|
||||
return
|
||||
@@ -646,7 +640,7 @@
|
||||
if(CM.handcuffed && CM.canmove && (CM.last_special <= world.time))
|
||||
CM.next_move = world.time + 100
|
||||
CM.last_special = world.time + 100
|
||||
if(isalienadult(CM) || (HULK in usr.mutations) || (SUPRSTR in CM.augmentations))//Don't want to do a lot of logic gating here.
|
||||
if(isalienadult(CM) || (HULK in usr.mutations))//Don't want to do a lot of logic gating here.
|
||||
usr << "\red You attempt to break your handcuffs. (This will take around 5 seconds and you need to stand still)"
|
||||
for(var/mob/O in viewers(CM))
|
||||
O.show_message(text("\red <B>[] is trying to break the handcuffs!</B>", CM), 1)
|
||||
@@ -684,7 +678,7 @@
|
||||
else if(CM.legcuffed && CM.canmove && (CM.last_special <= world.time))
|
||||
CM.next_move = world.time + 100
|
||||
CM.last_special = world.time + 100
|
||||
if(isalienadult(CM) || (HULK in usr.mutations) || (SUPRSTR in CM.augmentations))//Don't want to do a lot of logic gating here.
|
||||
if(isalienadult(CM) || (HULK in usr.mutations))//Don't want to do a lot of logic gating here.
|
||||
usr << "\red You attempt to break your legcuffs. (This will take around 5 seconds and you need to stand still)"
|
||||
for(var/mob/O in viewers(CM))
|
||||
O.show_message(text("\red <B>[] is trying to break the legcuffs!</B>", CM), 1)
|
||||
|
||||
Reference in New Issue
Block a user