@@ -16,8 +16,16 @@
|
||||
if (text2num(computer_id) == 2147483647) //this cid causes stickybans to go haywire
|
||||
log_access("Failed Login (invalid cid): [key] [address]-[computer_id]")
|
||||
return list("reason"="invalid login data", "desc"="Error: Could not check ban status, Please try again. Error message: Your computer provided an invalid Computer ID.)")
|
||||
var/admin = 0
|
||||
|
||||
if (type == "world")
|
||||
return ..() //shunt world topic banchecks to purely to byond's internal ban system
|
||||
|
||||
var/ckey = ckey(key)
|
||||
var/client/C = GLOB.directory[ckey]
|
||||
if (C && ckey == C.ckey && computer_id == C.computer_id && address == C.address)
|
||||
return //don't recheck connected clients.
|
||||
|
||||
var/admin = FALSE
|
||||
if(GLOB.admin_datums[ckey] || GLOB.deadmins[ckey])
|
||||
admin = 1
|
||||
|
||||
@@ -126,7 +134,6 @@
|
||||
bannedckey = ban["ckey"]
|
||||
|
||||
var/newmatch = FALSE
|
||||
var/client/C = GLOB.directory[ckey]
|
||||
var/cachedban = SSstickyban.cache[bannedckey]
|
||||
|
||||
//rogue ban in the process of being reverted.
|
||||
|
||||
@@ -693,7 +693,7 @@
|
||||
var/prev_dynamic_voting = CONFIG_GET(flag/dynamic_voting)
|
||||
CONFIG_SET(flag/dynamic_voting,!prev_dynamic_voting)
|
||||
if (!prev_dynamic_voting)
|
||||
to_chat(world, "<B>Vote is now between extended and dynamic chaos.</B>")
|
||||
to_chat(world, "<B>Vote is now a ranked choice of dynamic storytellers.</B>")
|
||||
else
|
||||
to_chat(world, "<B>Vote is now between extended and secret.</B>")
|
||||
log_admin("[key_name(usr)] [prev_dynamic_voting ? "disabled" : "enabled"] dynamic voting.")
|
||||
|
||||
@@ -438,6 +438,8 @@ GLOBAL_PROTECT(admin_verbs_hideable)
|
||||
set category = "Admin"
|
||||
set name = "Stealth Mode"
|
||||
if(holder)
|
||||
if(!check_rights(R_STEALTH, 0))
|
||||
return
|
||||
if(holder.fakekey)
|
||||
holder.fakekey = null
|
||||
if(isobserver(mob))
|
||||
|
||||
@@ -492,7 +492,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
message_admins("<span class='adminnotice'>[key_name_admin(usr)] assumed direct control of [M].</span>")
|
||||
log_admin("[key_name(usr)] assumed direct control of [M].")
|
||||
var/mob/adminmob = src.mob
|
||||
M.ckey = src.ckey
|
||||
adminmob.transfer_ckey(M, send_signal = FALSE)
|
||||
if( isobserver(adminmob) )
|
||||
qdel(adminmob)
|
||||
SSblackbox.record_feedback("tally", "admin_verb", 1, "Assume Direct Control") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
@@ -35,6 +35,9 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list(
|
||||
/client/proc/cmd_admin_grantfullaccess,
|
||||
/client/proc/cmd_admin_areatest_all,
|
||||
/client/proc/cmd_admin_areatest_station,
|
||||
#ifdef TESTING
|
||||
/client/proc/see_dirty_varedits,
|
||||
#endif
|
||||
/client/proc/cmd_admin_test_atmos_controllers,
|
||||
/client/proc/cmd_admin_rejuvenate,
|
||||
/datum/admins/proc/show_traitor_panel,
|
||||
@@ -84,8 +87,24 @@ GLOBAL_PROTECT(admin_verbs_debug_mapping)
|
||||
SSblackbox.record_feedback("tally", "admin_verb", 1, "Show Camera Range") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
SSblackbox.record_feedback("tally", "admin_verb", 1, "Show Camera Range")
|
||||
|
||||
#ifdef TESTING
|
||||
GLOBAL_LIST_EMPTY(dirty_vars)
|
||||
|
||||
|
||||
/client/proc/see_dirty_varedits()
|
||||
set category = "Mapping"
|
||||
set name = "Dirty Varedits"
|
||||
|
||||
var/list/dat = list()
|
||||
dat += "<h3>Abandon all hope ye who enter here</h3><br><br>"
|
||||
for(var/thing in GLOB.dirty_vars)
|
||||
dat += "[thing]<br>"
|
||||
CHECK_TICK
|
||||
var/datum/browser/popup = new(usr, "dirty_vars", "Dirty Varedits", 900, 750)
|
||||
popup.set_content(dat.Join())
|
||||
popup.open()
|
||||
#endif
|
||||
|
||||
/client/proc/sec_camera_report()
|
||||
set category = "Mapping"
|
||||
set name = "Camera Report"
|
||||
|
||||
@@ -137,9 +137,9 @@
|
||||
|
||||
/datum/admins/proc/makeWizard()
|
||||
|
||||
var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered for the position of a Wizard Foundation 'diplomat'?", ROLE_WIZARD, null)
|
||||
var/list/mob/candidates = pollGhostCandidates("Do you wish to be considered for the position of a Wizard Foundation 'diplomat'?", ROLE_WIZARD, null)
|
||||
|
||||
var/mob/dead/observer/selected = pick_n_take(candidates)
|
||||
var/mob/selected = pick_n_take(candidates)
|
||||
|
||||
var/mob/living/carbon/human/new_character = makeBody(selected)
|
||||
new_character.mind.make_Wizard()
|
||||
@@ -214,9 +214,9 @@
|
||||
|
||||
/datum/admins/proc/makeNukeTeam()
|
||||
var/datum/game_mode/nuclear/temp = new
|
||||
var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered for a nuke team being sent in?", ROLE_OPERATIVE, temp)
|
||||
var/list/mob/dead/observer/chosen = list()
|
||||
var/mob/dead/observer/theghost = null
|
||||
var/list/mob/candidates = pollGhostCandidates("Do you wish to be considered for a nuke team being sent in?", ROLE_OPERATIVE, temp)
|
||||
var/list/mob/chosen = list()
|
||||
var/mob/theghost = null
|
||||
|
||||
if(candidates.len)
|
||||
var/numagents = 5
|
||||
@@ -378,7 +378,7 @@
|
||||
ertemplate.enforce_human = prefs["enforce_human"]["value"] == "Yes" ? TRUE : FALSE
|
||||
ertemplate.opendoors = prefs["open_armory"]["value"] == "Yes" ? TRUE : FALSE
|
||||
|
||||
var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered for [ertemplate.polldesc] ?", "deathsquad", null)
|
||||
var/list/mob/candidates = pollGhostCandidates("Do you wish to be considered for [ertemplate.polldesc] ?", "deathsquad", null)
|
||||
var/teamSpawned = FALSE
|
||||
|
||||
if(candidates.len > 0)
|
||||
@@ -404,7 +404,7 @@
|
||||
numagents--
|
||||
continue // This guy's unlucky, not enough spawn points, we skip him.
|
||||
var/spawnloc = spawnpoints[numagents]
|
||||
var/mob/dead/observer/chosen_candidate = pick(candidates)
|
||||
var/mob/chosen_candidate = pick(candidates)
|
||||
candidates -= chosen_candidate
|
||||
if(!chosen_candidate.key)
|
||||
continue
|
||||
|
||||
@@ -484,11 +484,9 @@
|
||||
|
||||
user.do_attack_animation(L)
|
||||
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
if(H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK))
|
||||
playsound(H, 'sound/weapons/genhit.ogg', 50, TRUE)
|
||||
return FALSE
|
||||
if(L.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK))
|
||||
playsound(L, 'sound/weapons/genhit.ogg', 50, TRUE)
|
||||
return FALSE
|
||||
|
||||
switch (mode)
|
||||
if(BATON_STUN)
|
||||
@@ -797,7 +795,7 @@
|
||||
icon_state = "bed"
|
||||
can_buckle = 1
|
||||
|
||||
var/static/list/injected_reagents = list("corazone")
|
||||
var/static/list/injected_reagents = list(/datum/reagent/medicine/corazone)
|
||||
|
||||
/obj/structure/table/optable/abductor/Crossed(atom/movable/AM)
|
||||
. = ..()
|
||||
|
||||
@@ -143,9 +143,9 @@
|
||||
create_reagents(10)
|
||||
|
||||
if(overmind && overmind.blob_reagent_datum)
|
||||
reagents.add_reagent(overmind.blob_reagent_datum.id, 10)
|
||||
reagents.add_reagent(overmind.blob_reagent_datum.type, 10)
|
||||
else
|
||||
reagents.add_reagent("spore", 10)
|
||||
reagents.add_reagent(/datum/reagent/toxin/spore, 10)
|
||||
|
||||
// Attach the smoke spreader and setup/start it.
|
||||
S.attach(location)
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
icon = 'icons/mob/blob.dmi'
|
||||
icon_state = "blob_shield"
|
||||
desc = "A solid wall of slightly twitching tendrils."
|
||||
var/damaged_desc = "A wall of twitching tendrils."
|
||||
max_integrity = 150
|
||||
brute_resist = 0.25
|
||||
explosion_block = 3
|
||||
@@ -21,10 +22,10 @@
|
||||
|
||||
/obj/structure/blob/shield/update_icon()
|
||||
..()
|
||||
if(obj_integrity <= 70)
|
||||
icon_state = "blob_shield_damaged"
|
||||
name = "weakened strong blob"
|
||||
desc = "A wall of twitching tendrils."
|
||||
if(obj_integrity < max_integrity * 0.5)
|
||||
icon_state = "[initial(icon_state)]_damaged"
|
||||
name = "weakened [initial(name)]"
|
||||
desc = "[damaged_desc]"
|
||||
atmosblock = FALSE
|
||||
if(!weakened)
|
||||
armor = armor.setRating("melee" = 15, "bullet" = 15, "laser" = 5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
@@ -37,4 +38,27 @@
|
||||
if(weakened)
|
||||
armor = armor.setRating("melee" = 25, "bullet" = 25, "laser" = 15, "energy" = 10, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
weakened = FALSE
|
||||
air_update_turf(1)
|
||||
air_update_turf(1)
|
||||
|
||||
/obj/structure/blob/shield/reflective
|
||||
name = "reflective blob"
|
||||
desc = "A solid wall of slightly twitching tendrils with a reflective glow."
|
||||
damaged_desc = "A wall of twitching tendrils with a reflective glow."
|
||||
icon_state = "blob_glow"
|
||||
flags_1 = CHECK_RICOCHET_1
|
||||
point_return = 8
|
||||
max_integrity = 50
|
||||
brute_resist = 1
|
||||
explosion_block = 2
|
||||
|
||||
/obj/structure/blob/shield/reflective/handle_ricochet(obj/item/projectile/P)
|
||||
var/turf/p_turf = get_turf(P)
|
||||
var/face_direction = get_dir(src, p_turf)
|
||||
var/face_angle = dir2angle(face_direction)
|
||||
var/incidence_s = GET_ANGLE_OF_INCIDENCE(face_angle, (P.Angle + 180))
|
||||
if(abs(incidence_s) > 90 && abs(incidence_s) < 270)
|
||||
return FALSE
|
||||
var/new_angle_s = SIMPLIFY_DEGREES(face_angle + incidence_s)
|
||||
P.setAngle(new_angle_s)
|
||||
visible_message("<span class='warning'>[P] reflects off [src]!</span>")
|
||||
return TRUE
|
||||
@@ -113,12 +113,22 @@
|
||||
|
||||
/mob/camera/blob/verb/create_shield_power()
|
||||
set category = "Blob"
|
||||
set name = "Create Shield Blob (15)"
|
||||
set desc = "Create a shield blob, which will block fire and is hard to kill."
|
||||
set name = "Create/Upgrade Shield Blob (15)"
|
||||
set desc = "Create a shield blob, which will block fire and is hard to kill. Using this on an existing shield blob turns it into a reflective blob, capable of reflecting most projectiles but making it much weaker than usual to brute attacks."
|
||||
create_shield()
|
||||
|
||||
/mob/camera/blob/proc/create_shield(turf/T)
|
||||
createSpecial(15, /obj/structure/blob/shield, 0, 0, T)
|
||||
var/obj/structure/blob/shield/S = locate(/obj/structure/blob/shield) in T
|
||||
if(S)
|
||||
if(!can_buy(15))
|
||||
return
|
||||
if(S.obj_integrity < S.max_integrity * 0.5)
|
||||
to_chat(src, "<span class='warning'>This shield blob is too damaged to be modified properly!</span>")
|
||||
return
|
||||
to_chat(src, "<span class='warning'>You secrete a reflective ooze over the shield blob, allowing it to reflect projectiles at the cost of reduced intregrity.</span>")
|
||||
S.change_to(/obj/structure/blob/shield/reflective, src)
|
||||
else
|
||||
createSpecial(15, /obj/structure/blob/shield, 0, 0, T)
|
||||
|
||||
/mob/camera/blob/verb/create_resource()
|
||||
set category = "Blob"
|
||||
@@ -156,7 +166,7 @@
|
||||
if(!can_buy(40))
|
||||
return
|
||||
|
||||
var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as a [blob_reagent_datum.name] blobbernaut?", ROLE_BLOB, null, ROLE_BLOB, 50) //players must answer rapidly
|
||||
var/list/mob/candidates = pollGhostCandidates("Do you want to play as a [blob_reagent_datum.name] blobbernaut?", ROLE_BLOB, null, ROLE_BLOB, 50) //players must answer rapidly
|
||||
if(LAZYLEN(candidates)) //if we got at least one candidate, they're a blobbernaut now.
|
||||
B.max_integrity = initial(B.max_integrity) * 0.25 //factories that produced a blobbernaut have much lower health
|
||||
B.obj_integrity = min(B.obj_integrity, B.max_integrity)
|
||||
@@ -171,7 +181,7 @@
|
||||
blobber.update_icons()
|
||||
blobber.adjustHealth(blobber.maxHealth * 0.5)
|
||||
blob_mobs += blobber
|
||||
var/mob/dead/observer/C = pick(candidates)
|
||||
var/mob/C = pick(candidates)
|
||||
C.transfer_ckey(blobber)
|
||||
SEND_SOUND(blobber, sound('sound/effects/blobattack.ogg'))
|
||||
SEND_SOUND(blobber, sound('sound/effects/attackblob.ogg'))
|
||||
@@ -359,7 +369,7 @@
|
||||
to_chat(src, "<b>You can expand, which will attack people, damage objects, or place a Normal Blob if the tile is clear.</b>")
|
||||
to_chat(src, "<i>Normal Blobs</i> will expand your reach and can be upgraded into special blobs that perform certain functions.")
|
||||
to_chat(src, "<b>You can upgrade normal blobs into the following types of blob:</b>")
|
||||
to_chat(src, "<i>Shield Blobs</i> are strong and expensive blobs which take more damage. In additon, they are fireproof and can block air, use these to protect yourself from station fires.")
|
||||
to_chat(src, "<i>Shield Blobs</i> are strong and expensive blobs which take more damage. In additon, they are fireproof and can block air, use these to protect yourself from station fires. Upgrading them again will result in a reflective blob, capable of reflecting most projectiles at the cost of the strong blob's extra health.")
|
||||
to_chat(src, "<i>Resource Blobs</i> are blobs which produce more resources for you, build as many of these as possible to consume the station. This type of blob must be placed near node blobs or your core to work.")
|
||||
to_chat(src, "<i>Factory Blobs</i> are blobs that spawn blob spores which will attack nearby enemies. This type of blob must be placed near node blobs or your core to work.")
|
||||
to_chat(src, "<i>Blobbernauts</i> can be produced from factories for a cost, and are hard to kill, powerful, and moderately smart. The factory used to create one will become fragile and briefly unable to produce spores.")
|
||||
|
||||
@@ -84,8 +84,8 @@
|
||||
//It is called from your coffin on close (by you only)
|
||||
if(poweron_masquerade == TRUE || owner.current.AmStaked())
|
||||
return FALSE
|
||||
owner.current.adjustStaminaLoss(-2 + (regenRate * -10) * mult, 0) // Humans lose stamina damage really quickly. Vamps should heal more.
|
||||
owner.current.adjustCloneLoss(-1 * (regenRate * 4) * mult, 0)
|
||||
owner.current.adjustStaminaLoss(-2 + (regenRate * 8) * mult, 0) // Humans lose stamina damage really quickly. Vamps should heal more.
|
||||
owner.current.adjustCloneLoss(-0.1 * (regenRate * 2) * mult, 0)
|
||||
owner.current.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * (regenRate * 4) * mult) //adjustBrainLoss(-1 * (regenRate * 4) * mult, 0)
|
||||
// No Bleeding
|
||||
if(ishuman(owner.current)) //NOTE Current bleeding is horrible, not to count the amount of blood ballistics delete.
|
||||
@@ -97,7 +97,7 @@
|
||||
var/fireheal = 0 // BURN: Heal in Coffin while Fakedeath, or when damage above maxhealth (you can never fully heal fire)
|
||||
var/amInCoffinWhileTorpor = istype(C.loc, /obj/structure/closet/crate/coffin) && (mult == 0 || HAS_TRAIT(C, TRAIT_DEATHCOMA)) // Check for mult 0 OR death coma. (mult 0 means we're testing from coffin)
|
||||
if(amInCoffinWhileTorpor)
|
||||
mult *= 5 // Increase multiplier if we're sleeping in a coffin.
|
||||
mult *= 4 // Increase multiplier if we're sleeping in a coffin.
|
||||
fireheal = min(C.getFireLoss_nonProsthetic(), regenRate) // NOTE: Burn damage ONLY heals in torpor.
|
||||
costMult = 0.25
|
||||
C.ExtinguishMob()
|
||||
@@ -118,6 +118,8 @@
|
||||
if(bruteheal + fireheal + toxinheal > 0) // Just a check? Don't heal/spend, and return.
|
||||
if(mult == 0)
|
||||
return TRUE
|
||||
if(owner.current.stat >= UNCONSCIOUS) //Faster regeneration while unconcious, so you dont have to wait all day
|
||||
mult *= 2
|
||||
// We have damage. Let's heal (one time)
|
||||
C.adjustBruteLoss(-bruteheal * mult, forced = TRUE)// Heal BRUTE / BURN in random portions throughout the body.
|
||||
C.adjustFireLoss(-fireheal * mult, forced = TRUE)
|
||||
@@ -187,19 +189,19 @@
|
||||
/datum/antagonist/bloodsucker/proc/HandleDeath()
|
||||
// FINAL DEATH
|
||||
// Fire Damage? (above double health)
|
||||
if (owner.current.getFireLoss_nonProsthetic() >= owner.current.getMaxHealth() * 2)
|
||||
if(owner.current.getFireLoss_nonProsthetic() >= owner.current.getMaxHealth() * 1.5)
|
||||
FinalDeath()
|
||||
return
|
||||
// Staked while "Temp Death" or Asleep
|
||||
if (owner.current.StakeCanKillMe() && owner.current.AmStaked())
|
||||
if(owner.current.StakeCanKillMe() && owner.current.AmStaked())
|
||||
FinalDeath()
|
||||
return
|
||||
// Not "Alive"?
|
||||
if (!owner.current || !isliving(owner.current) || isbrain(owner.current) || !get_turf(owner.current))
|
||||
if(!owner.current || !isliving(owner.current) || isbrain(owner.current) || !get_turf(owner.current))
|
||||
FinalDeath()
|
||||
return
|
||||
// Missing Brain or Heart?
|
||||
if (!owner.current.HaveBloodsuckerBodyparts())
|
||||
if(!owner.current.HaveBloodsuckerBodyparts())
|
||||
FinalDeath()
|
||||
return
|
||||
// Disable Powers: Masquerade * NOTE * This should happen as a FLAW!
|
||||
@@ -212,21 +214,21 @@
|
||||
var/total_toxloss = owner.current.getToxLoss() //This is neater than just putting it in total_damage
|
||||
var/total_damage = total_brute + total_burn + total_toxloss
|
||||
// Died? Convert to Torpor (fake death)
|
||||
if (owner.current.stat >= DEAD)
|
||||
if(owner.current.stat >= DEAD)
|
||||
Torpor_Begin()
|
||||
to_chat(owner, "<span class='danger'>Your immortal body will not yet relinquish your soul to the abyss. You enter Torpor.</span>")
|
||||
sleep(30) //To avoid spam
|
||||
if (poweron_masquerade == TRUE)
|
||||
to_chat(owner, "<span class='warning'>Your wounds will not heal until you disable the <span class='boldnotice'>Masquerade</span> power.</span>")
|
||||
// End Torpor:
|
||||
else // No damage, OR toxin healed AND brute healed and NOT in coffin (since you cannot heal burn)
|
||||
if (total_damage <= 0 || total_toxloss <= 0 && total_brute <= 0 && !istype(owner.current.loc, /obj/structure/closet/crate/coffin))
|
||||
if(total_damage <= 0 || total_toxloss <= 0 && total_brute <= 0 && !istype(owner.current.loc, /obj/structure/closet/crate/coffin))
|
||||
// Not Daytime, Not in Torpor
|
||||
if (!SSticker.mode.is_daylight() && HAS_TRAIT_FROM(owner.current, TRAIT_DEATHCOMA, "bloodsucker"))
|
||||
if(!SSticker.mode.is_daylight() && HAS_TRAIT_FROM(owner.current, TRAIT_DEATHCOMA, "bloodsucker"))
|
||||
Torpor_End()
|
||||
// Fake Unconscious
|
||||
if (poweron_masquerade == TRUE && total_damage >= owner.current.getMaxHealth() - HEALTH_THRESHOLD_FULLCRIT)
|
||||
if(poweron_masquerade == TRUE && total_damage >= owner.current.getMaxHealth() - HEALTH_THRESHOLD_FULLCRIT)
|
||||
owner.current.Unconscious(20,1)
|
||||
|
||||
//HEALTH_THRESHOLD_CRIT 0
|
||||
//HEALTH_THRESHOLD_FULLCRIT -30
|
||||
//HEALTH_THRESHOLD_DEAD -100
|
||||
@@ -241,8 +243,8 @@
|
||||
owner.current.update_sight()
|
||||
owner.current.reload_fullscreen()
|
||||
// Disable ALL Powers
|
||||
for (var/datum/action/bloodsucker/power in powers)
|
||||
if (power.active && !power.can_use_in_torpor)
|
||||
for(var/datum/action/bloodsucker/power in powers)
|
||||
if(power.active && !power.can_use_in_torpor)
|
||||
power.DeactivatePower()
|
||||
|
||||
|
||||
@@ -281,7 +283,7 @@
|
||||
// Free my Vassals!
|
||||
FreeAllVassals()
|
||||
// Elders get Dusted
|
||||
if (vamplevel >= 4) // (vamptitle)
|
||||
if(vamplevel >= 4) // (vamptitle)
|
||||
owner.current.visible_message("<span class='warning'>[owner.current]'s skin crackles and dries, their skin and bones withering to dust. A hollow cry whips from what is now a sandy pile of remains.</span>", \
|
||||
"<span class='userdanger'>Your soul escapes your withering body as the abyss welcomes you to your Final Death.</span>", \
|
||||
"<span class='italics'>You hear a dry, crackling sound.</span>")
|
||||
@@ -306,7 +308,7 @@
|
||||
if (!isliving(src))
|
||||
return
|
||||
var/mob/living/L = src
|
||||
if (!L.AmBloodsucker())
|
||||
if(!L.AmBloodsucker())
|
||||
return
|
||||
// We're a vamp? Try to eat food...
|
||||
var/datum/antagonist/bloodsucker/bloodsuckerdatum = mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
|
||||
@@ -315,7 +317,7 @@
|
||||
|
||||
/datum/antagonist/bloodsucker/proc/handle_eat_human_food(var/food_nutrition) // Called from snacks.dm and drinks.dm
|
||||
set waitfor = FALSE
|
||||
if (!owner.current || !iscarbon(owner.current))
|
||||
if(!owner.current || !iscarbon(owner.current))
|
||||
return
|
||||
var/mob/living/carbon/C = owner.current
|
||||
// Remove Nutrition, Give Bad Food
|
||||
|
||||
@@ -35,8 +35,8 @@
|
||||
var/warn_sun_burn = FALSE // So we only get the sun burn message once per day.
|
||||
var/had_toxlover = FALSE
|
||||
// LISTS
|
||||
var/static/list/defaultTraits = list (TRAIT_STABLEHEART, TRAIT_NOBREATH, TRAIT_SLEEPIMMUNE, TRAIT_NOCRITDAMAGE, TRAIT_RESISTCOLD, TRAIT_RADIMMUNE, TRAIT_VIRUSIMMUNE, TRAIT_NIGHT_VISION, \
|
||||
TRAIT_NOSOFTCRIT, TRAIT_NOHARDCRIT, TRAIT_AGEUSIA, TRAIT_COLDBLOODED, TRAIT_NONATURALHEAL, TRAIT_NOMARROW, TRAIT_NOPULSE, TRAIT_NOCLONE)
|
||||
var/static/list/defaultTraits = list (TRAIT_STABLEHEART, TRAIT_NOBREATH, TRAIT_SLEEPIMMUNE, TRAIT_NOCRITDAMAGE, TRAIT_RESISTCOLD, TRAIT_RADIMMUNE, TRAIT_NIGHT_VISION, \
|
||||
TRAIT_NOSOFTCRIT, TRAIT_NOHARDCRIT, TRAIT_AGEUSIA, TRAIT_COLDBLOODED, TRAIT_NONATURALHEAL, TRAIT_NOMARROW, TRAIT_NOPULSE, TRAIT_VIRUSIMMUNE)
|
||||
// NOTES: TRAIT_AGEUSIA <-- Doesn't like flavors.
|
||||
// REMOVED: TRAIT_NODEATH
|
||||
// TO ADD:
|
||||
@@ -183,7 +183,7 @@
|
||||
BuyPower(new /datum/action/bloodsucker/masquerade)
|
||||
BuyPower(new /datum/action/bloodsucker/veil)
|
||||
// Traits
|
||||
for (var/T in defaultTraits)
|
||||
for(var/T in defaultTraits)
|
||||
ADD_TRAIT(owner.current, T, "bloodsucker")
|
||||
if(HAS_TRAIT(owner.current, TRAIT_TOXINLOVER)) //No slime bonuses here, no thank you
|
||||
had_toxlover = TRUE
|
||||
@@ -200,10 +200,10 @@
|
||||
var/mob/living/carbon/human/H = owner.current
|
||||
var/datum/species/S = H.dna.species
|
||||
// Make Changes
|
||||
S.brutemod *= 0.5 // <-------------------- Start small, but burn mod increases based on rank!
|
||||
S.coldmod = 0
|
||||
S.stunmod *= 0.25
|
||||
S.siemens_coeff *= 0.75 //base electrocution coefficient 1
|
||||
H.physiology.brute_mod *= 0.8 // <-------------------- Start small, but burn mod increases based on rank!
|
||||
H.physiology.cold_mod = 0
|
||||
H.physiology.stun_mod *= 0.35
|
||||
H.physiology.siemens_coeff *= 0.75 //base electrocution coefficient 1
|
||||
//S.heatmod += 0.5 // Heat shouldn't affect. Only Fire.
|
||||
//S.punchstunthreshold = 8 //damage at which punches from this race will stun 9
|
||||
S.punchdamagelow += 1 //lowest possible punch damage 0
|
||||
@@ -319,12 +319,10 @@ datum/antagonist/bloodsucker/proc/SpendRank()
|
||||
if(ishuman(owner.current))
|
||||
var/mob/living/carbon/human/H = owner.current
|
||||
var/datum/species/S = H.dna.species
|
||||
S.burnmod *= 0.025 // Slightly more burn damage
|
||||
S.stunmod *= 0.95 // Slightly less stun time.
|
||||
S.punchdamagelow += 0.5
|
||||
S.punchdamagehigh += 0.5 // NOTE: This affects the hitting power of Brawn.
|
||||
// More Health
|
||||
owner.current.setMaxHealth(owner.current.maxHealth + 5)
|
||||
owner.current.setMaxHealth(owner.current.maxHealth + 10)
|
||||
// Vamp Stats
|
||||
regenRate += 0.05 // Points of brute healed (starts at 0.3)
|
||||
feedAmount += 2 // Increase how quickly I munch down vics (15)
|
||||
@@ -336,7 +334,7 @@ datum/antagonist/bloodsucker/proc/SpendRank()
|
||||
// Assign True Reputation
|
||||
if(vamplevel == 4)
|
||||
SelectReputation(am_fledgling = FALSE, forced = TRUE)
|
||||
to_chat(owner.current, "<span class='notice'>You are now a rank [vamplevel] Bloodsucker. Your strength, resistence, health, feed rate, regen rate, and maximum blood have all increased!</span>")
|
||||
to_chat(owner.current, "<span class='notice'>You are now a rank [vamplevel] Bloodsucker. Your strength, health, feed rate, regen rate, and maximum blood have all increased!</span>")
|
||||
to_chat(owner.current, "<span class='notice'>Your existing powers have all ranked up as well!</span>")
|
||||
update_hud(TRUE)
|
||||
owner.current.playsound_local(null, 'sound/effects/pope_entry.ogg', 25, 1) // Play THIS sound for user only. The "null" is where turf would go if a location was needed. Null puts it right in their head.
|
||||
|
||||
@@ -56,11 +56,6 @@
|
||||
var/obj/item/organ/eyes/vassal/E = new
|
||||
E.Insert(owner.current)
|
||||
|
||||
/obj/item/organ/eyes/vassal/
|
||||
lighting_alpha = 180 // LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE <--- This is too low a value at 128. We need to SEE what the darkness is so we can hide in it.
|
||||
see_in_dark = 12
|
||||
flash_protect = -1 //These eyes are weaker to flashes, but let you see in the dark
|
||||
|
||||
/datum/antagonist/vassal/proc/remove_thrall_eyes()
|
||||
var/obj/item/organ/eyes/E = new
|
||||
E.Insert(owner.current)
|
||||
|
||||
@@ -51,6 +51,11 @@
|
||||
return "<span class='danger'>no</span>" // Bloodsuckers don't have a heartbeat at all when stopped (default is "an unstable")
|
||||
// EYES //
|
||||
|
||||
/obj/item/organ/eyes/vassal/
|
||||
lighting_alpha = 180 // LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE <--- This is too low a value at 128. We need to SEE what the darkness is so we can hide in it.
|
||||
see_in_dark = 12
|
||||
flash_protect = -1 //These eyes are weaker to flashes, but let you see in the dark
|
||||
|
||||
/obj/item/organ/eyes/vassal/bloodsucker
|
||||
flash_protect = 2 //Eye healing isnt working properly
|
||||
sight_flags = SEE_MOBS // Taken from augmented_eyesight.dm
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
var/mob/living/carbon/C = target
|
||||
// Needs to be Down/Slipped in some way to Stake.
|
||||
if(!C.can_be_staked() || target == user)
|
||||
to_chat(user, "<span class='danger'>You cant stake [target] when they are moving moving about! They have to be laying down!</span>")
|
||||
to_chat(user, "<span class='danger'>You can't stake [target] when they are moving about! They have to be laying down or grabbed by the neck!</span>")
|
||||
return
|
||||
// Oops! Can't.
|
||||
if(HAS_TRAIT(C, TRAIT_PIERCEIMMUNE))
|
||||
@@ -113,7 +113,7 @@
|
||||
// Can this target be staked? If someone stands up before this is complete, it fails. Best used on someone stationary.
|
||||
/mob/living/carbon/proc/can_be_staked()
|
||||
//return resting || IsKnockdown() || IsUnconscious() || (stat && (stat != SOFT_CRIT || pulledby)) || (has_trait(TRAIT_FAKEDEATH)) || resting || IsStun() || IsFrozen() || (pulledby && pulledby.grab_state >= GRAB_NECK)
|
||||
return (src.resting || src.lying)
|
||||
return (resting || lying || IsUnconscious() || pulledby && pulledby.grab_state >= GRAB_NECK)
|
||||
// ABOVE: Taken from update_mobility() in living.dm
|
||||
|
||||
/obj/item/stake/hardened
|
||||
|
||||
@@ -130,7 +130,7 @@
|
||||
/obj/structure/bloodsucker/vassalrack/MouseDrop_T(atom/movable/O, mob/user)
|
||||
if(!O.Adjacent(src) || O == user || !isliving(O) || !isliving(user) || useLock || has_buckled_mobs() || user.incapacitated())
|
||||
return
|
||||
if(!anchored && user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER))
|
||||
if(!anchored && isvamp(user))
|
||||
to_chat(user, "<span class='danger'>Until this rack is secured in place, it cannot serve its purpose.</span>")
|
||||
return
|
||||
// PULL TARGET: Remember if I was pullin this guy, so we can restore this
|
||||
@@ -183,7 +183,7 @@
|
||||
|
||||
/obj/structure/bloodsucker/vassalrack/user_unbuckle_mob(mob/living/M, mob/user)
|
||||
// Attempt Unbuckle
|
||||
if(!user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER))
|
||||
if(!isvamp(user))
|
||||
if(M == user)
|
||||
M.visible_message("<span class='danger'>[user] tries to release themself from the rack!</span>",\
|
||||
"<span class='danger'>You attempt to release yourself from the rack!</span>") // For sound if not seen --> "<span class='italics'>You hear a squishy wet noise.</span>")
|
||||
@@ -275,7 +275,7 @@
|
||||
// All done!
|
||||
if(convert_progress <= 0)
|
||||
// FAIL: Can't be Vassal
|
||||
if(!SSticker.mode.can_make_vassal(target, user, display_warning=FALSE) && HAS_TRAIT(target, TRAIT_MINDSHIELD)) // If I'm an unconvertable Antag ONLY
|
||||
if(!SSticker.mode.can_make_vassal(target, user, display_warning=FALSE) || HAS_TRAIT(target, TRAIT_MINDSHIELD)) // If I'm an unconvertable Antag ONLY
|
||||
to_chat(user, "<span class='danger'>[target] doesn't respond to your persuasion. It doesn't appear they can be converted to follow you, they either have a mindshield or their external loyalties are too difficult for you to break.<i>\[ALT+click to release\]</span>")
|
||||
convert_progress ++ // Pop it back up some. Avoids wasting Blood on a lost cause.
|
||||
// SUCCESS: All done!
|
||||
@@ -453,7 +453,7 @@
|
||||
|
||||
/obj/structure/bloodsucker/candelabrum/examine(mob/user)
|
||||
. = ..()
|
||||
if((user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) || isobserver(user))
|
||||
if((isvamp()) || isobserver(user))
|
||||
. += {"<span class='cult'>This is a magical candle which drains at the sanity of mortals who are not under your command while it is active.</span>"}
|
||||
. += {"<span class='cult'>You can alt click on it from any range to turn it on remotely, or simply be next to it and click on it to turn it on and off normally.</span>"}
|
||||
/* if(user.mind.has_antag_datum(ANTAG_DATUM_VASSAL)
|
||||
@@ -461,15 +461,13 @@
|
||||
You can turn it on and off by clicking on it while you are next to it</span>"} */
|
||||
|
||||
/obj/structure/bloodsucker/candelabrum/attack_hand(mob/user)
|
||||
var/datum/antagonist/bloodsucker/V = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) //I wish there was a better way to do this
|
||||
var/datum/antagonist/vassal/T = user.mind.has_antag_datum(ANTAG_DATUM_VASSAL)
|
||||
if(istype(V) || istype(T))
|
||||
if(isvamp(user) || istype(T))
|
||||
toggle()
|
||||
|
||||
/obj/structure/bloodsucker/candelabrum/AltClick(mob/user)
|
||||
var/datum/antagonist/bloodsucker/V = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
|
||||
// Bloodsuckers can turn their candles on from a distance. SPOOOOKY.
|
||||
if(istype(V))
|
||||
if(isvamp(user))
|
||||
toggle()
|
||||
|
||||
/obj/structure/bloodsucker/candelabrum/proc/toggle(mob/user)
|
||||
@@ -486,8 +484,7 @@
|
||||
if(lit)
|
||||
for(var/mob/living/carbon/human/H in viewers(7, src))
|
||||
var/datum/antagonist/vassal/T = H.mind.has_antag_datum(ANTAG_DATUM_VASSAL)
|
||||
var/datum/antagonist/bloodsucker/V = H.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
|
||||
if(V || T) //We dont want vassals or vampires affected by this
|
||||
if(isvamp(H) || T) //We dont want vassals or vampires affected by this
|
||||
return
|
||||
H.hallucination = 20
|
||||
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "vampcandle", /datum/mood_event/vampcandle)
|
||||
|
||||
@@ -9,8 +9,9 @@
|
||||
bloodsucker_can_buy = TRUE
|
||||
amToggle = TRUE
|
||||
warn_constant_cost = TRUE
|
||||
var/was_running
|
||||
|
||||
var/light_min = 0.5 // If lum is above this, no good.
|
||||
var/light_min = 0.2 // If lum is above this, no good.
|
||||
|
||||
/datum/action/bloodsucker/cloak/CheckCanUse(display_error)
|
||||
. = ..()
|
||||
@@ -26,18 +27,16 @@
|
||||
/datum/action/bloodsucker/cloak/ActivatePower()
|
||||
var/datum/antagonist/bloodsucker/bloodsuckerdatum = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
|
||||
var/mob/living/user = owner
|
||||
var/was_running = (user.m_intent == MOVE_INTENT_RUN)
|
||||
was_running = (user.m_intent == MOVE_INTENT_RUN)
|
||||
if(was_running)
|
||||
user.toggle_move_intent()
|
||||
ADD_TRAIT(user, TRAIT_NORUNNING, "cloak of darkness")
|
||||
while(bloodsuckerdatum && ContinueActive(user) || user.m_intent == MOVE_INTENT_RUN)
|
||||
// Pay Blood Toll (if awake)
|
||||
owner.alpha = max(0, owner.alpha - min(75, 20 + 15 * level_current))
|
||||
owner.alpha = max(20, owner.alpha - min(75, 10 + 5 * level_current))
|
||||
bloodsuckerdatum.AddBloodVolume(-0.2)
|
||||
sleep(5) // Check every few ticks that we haven't disabled this power
|
||||
// Return to Running (if you were before)
|
||||
if(was_running && user.m_intent != MOVE_INTENT_RUN)
|
||||
user.toggle_move_intent()
|
||||
|
||||
/datum/action/bloodsucker/cloak/ContinueActive(mob/living/user, mob/living/target)
|
||||
if (!..())
|
||||
@@ -55,3 +54,5 @@
|
||||
..()
|
||||
REMOVE_TRAIT(user, TRAIT_NORUNNING, "cloak of darkness")
|
||||
user.alpha = 255
|
||||
if(was_running && user.m_intent != MOVE_INTENT_RUN)
|
||||
user.toggle_move_intent()
|
||||
|
||||
@@ -51,14 +51,17 @@
|
||||
REMOVE_TRAIT(user, TRAIT_COLDBLOODED, "bloodsucker")
|
||||
REMOVE_TRAIT(user, TRAIT_NOHARDCRIT, "bloodsucker")
|
||||
REMOVE_TRAIT(user, TRAIT_NOSOFTCRIT, "bloodsucker")
|
||||
REMOVE_TRAIT(user, TRAIT_VIRUSIMMUNE, "bloodsucker")
|
||||
var/obj/item/organ/heart/vampheart/H = user.getorganslot(ORGAN_SLOT_HEART)
|
||||
|
||||
var/obj/item/organ/eyes/vassal/bloodsucker/E = user.getorganslot(ORGAN_SLOT_EYES)
|
||||
E.flash_protect = 0
|
||||
|
||||
// WE ARE ALIVE! //
|
||||
bloodsuckerdatum.poweron_masquerade = TRUE
|
||||
while(bloodsuckerdatum && ContinueActive(user))
|
||||
|
||||
// HEART
|
||||
if (istype(H))
|
||||
if(istype(H))
|
||||
H.FakeStart()
|
||||
|
||||
// PASSIVE (done from LIFE)
|
||||
@@ -67,7 +70,7 @@
|
||||
// Don't Heal
|
||||
|
||||
// Pay Blood Toll (if awake)
|
||||
if (user.stat == CONSCIOUS)
|
||||
if(user.stat == CONSCIOUS)
|
||||
bloodsuckerdatum.AddBloodVolume(-0.2)
|
||||
|
||||
sleep(20) // Check every few ticks that we haven't disabled this power
|
||||
@@ -89,9 +92,13 @@
|
||||
ADD_TRAIT(user, TRAIT_COLDBLOODED, "bloodsucker")
|
||||
ADD_TRAIT(user, TRAIT_NOHARDCRIT, "bloodsucker")
|
||||
ADD_TRAIT(user, TRAIT_NOSOFTCRIT, "bloodsucker")
|
||||
ADD_TRAIT(user, TRAIT_VIRUSIMMUNE, "bloodsucker")
|
||||
|
||||
// HEART
|
||||
var/obj/item/organ/heart/H = user.getorganslot(ORGAN_SLOT_HEART)
|
||||
var/obj/item/organ/eyes/vassal/bloodsucker/E = user.getorganslot(ORGAN_SLOT_EYES)
|
||||
H.Stop()
|
||||
|
||||
E.flash_protect = 2
|
||||
|
||||
to_chat(user, "<span class='notice'>Your heart beats one final time, while your skin dries out and your icy pallor returns.</span>")
|
||||
|
||||
@@ -89,17 +89,14 @@
|
||||
|
||||
if(istype(target))
|
||||
target.Stun(40) //Utterly useless without this, its okay since there are so many checks to go through
|
||||
target.silent = 45 //Shhhh little lamb
|
||||
target.apply_status_effect(STATUS_EFFECT_MESMERIZE, 45) //So you cant rotate with combat mode, plus fancy status alert
|
||||
|
||||
if(do_mob(user, target, 40, 0, TRUE, extra_checks=CALLBACK(src, .proc/ContinueActive, user, target)))
|
||||
PowerActivatedSuccessfully() // PAY COST! BEGIN COOLDOWN!
|
||||
var/power_time = 90 + level_current * 12
|
||||
target.silent = power_time + 20
|
||||
target.apply_status_effect(STATUS_EFFECT_MESMERIZE, 100 + level_current * 15)
|
||||
target.apply_status_effect(STATUS_EFFECT_MESMERIZE, power_time + 80)
|
||||
to_chat(user, "<span class='notice'>[target] is fixed in place by your hypnotic gaze.</span>")
|
||||
target.Stun(power_time)
|
||||
//target.silent += power_time / 10 // Silent isn't based on ticks.
|
||||
target.next_move = world.time + power_time // <--- Use direct change instead. We want an unmodified delay to their next move // target.changeNext_move(power_time) // check click.dm
|
||||
target.notransform = TRUE // <--- Fuck it. We tried using next_move, but they could STILL resist. We're just doing a hard freeze.
|
||||
spawn(power_time)
|
||||
|
||||
@@ -89,13 +89,7 @@
|
||||
user.invisibility = INVISIBILITY_MAXIMUM
|
||||
|
||||
// LOSE CUFFS
|
||||
if(user.handcuffed)
|
||||
var/obj/O = user.handcuffed
|
||||
user.dropItemToGround(O)
|
||||
if(user.legcuffed)
|
||||
var/obj/O = user.legcuffed
|
||||
user.dropItemToGround(O)
|
||||
|
||||
|
||||
// Wait...
|
||||
sleep(mist_delay / 2)
|
||||
|
||||
|
||||
@@ -13,5 +13,5 @@
|
||||
|
||||
//Recover from stuns.
|
||||
/obj/effect/proc_holder/changeling/adrenaline/sting_action(mob/living/user)
|
||||
user.do_adrenaline(0, FALSE, 70, 0, TRUE, list("epinephrine" = 3, "changelingmeth" = 10, "mannitol" = 10, "regen_jelly" = 10, "changelingadrenaline" = 5), "<span class='notice'>Energy rushes through us.</span>", 0, 0.75, 0)
|
||||
user.do_adrenaline(0, FALSE, 70, 0, TRUE, list(/datum/reagent/medicine/epinephrine = 3, /datum/reagent/drug/methamphetamine/changeling = 10, /datum/reagent/medicine/mannitol = 10, /datum/reagent/medicine/regen_jelly = 10, /datum/reagent/medicine/changelingadrenaline = 5), "<span class='notice'>Energy rushes through us.</span>", 0, 0.75, 0)
|
||||
return TRUE
|
||||
@@ -58,7 +58,7 @@
|
||||
target.mind.linglink = 1
|
||||
target.say("[MODE_TOKEN_CHANGELING] AAAAARRRRGGGGGHHHHH!!")
|
||||
to_chat(target, "<font color=#800040><span class='boldannounce'>You can now communicate in the changeling hivemind, say \"[MODE_TOKEN_CHANGELING] message\" to communicate!</span>")
|
||||
target.reagents.add_reagent("salbutamol", 40) // So they don't choke to death while you interrogate them
|
||||
target.reagents.add_reagent(/datum/reagent/medicine/salbutamol, 40) // So they don't choke to death while you interrogate them
|
||||
sleep(1800)
|
||||
SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]", "[i]"))
|
||||
if(!do_mob(user, target, 20))
|
||||
|
||||
@@ -500,7 +500,7 @@
|
||||
/obj/item/clothing/suit/space/changeling/process()
|
||||
if(ishuman(loc))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
H.reagents.add_reagent("salbutamol", REAGENTS_METABOLISM)
|
||||
H.reagents.add_reagent(/datum/reagent/medicine/salbutamol, REAGENTS_METABOLISM)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/changeling
|
||||
name = "flesh mass"
|
||||
|
||||
@@ -28,10 +28,10 @@
|
||||
C.vomit(0, toxic = TRUE)
|
||||
O.forceMove(get_turf(user))
|
||||
|
||||
user.reagents.add_reagent("mutadone", 10)
|
||||
user.reagents.add_reagent("pen_jelly", 20)
|
||||
user.reagents.add_reagent("antihol", 10)
|
||||
user.reagents.add_reagent("mannitol", 25)
|
||||
user.reagents.add_reagent(/datum/reagent/medicine/mutadone, 10)
|
||||
user.reagents.add_reagent(/datum/reagent/medicine/pen_acid/pen_jelly, 20)
|
||||
user.reagents.add_reagent(/datum/reagent/medicine/antihol, 10)
|
||||
user.reagents.add_reagent(/datum/reagent/medicine/mannitol, 25)
|
||||
|
||||
if(isliving(user))
|
||||
var/mob/living/L = user
|
||||
|
||||
@@ -104,11 +104,11 @@
|
||||
var/mob/living/carbon/C = target
|
||||
. = TRUE
|
||||
if(istype(C))
|
||||
if(C.reagents.has_reagent("changeling_sting_real"))
|
||||
C.reagents.add_reagent("changeling_sting_real",120)
|
||||
if(C.reagents.has_reagent(/datum/reagent/changeling_string))
|
||||
C.reagents.add_reagent(/datum/reagent/changeling_string,120)
|
||||
log_combat(user, target, "stung", "transformation sting", ", extending the duration.")
|
||||
else
|
||||
C.reagents.add_reagent("changeling_sting_real",120,list("desired_dna" = selected_dna.dna))
|
||||
C.reagents.add_reagent(/datum/reagent/changeling_string,120,list("desired_dna" = selected_dna.dna))
|
||||
log_combat(user, target, "stung", "transformation sting", " new identity is '[selected_dna.dna.real_name]'")
|
||||
|
||||
|
||||
@@ -243,8 +243,8 @@
|
||||
/obj/effect/proc_holder/changeling/sting/LSD/sting_action(mob/user, mob/target)
|
||||
log_combat(user, target, "stung", "LSD sting")
|
||||
if(target.reagents)
|
||||
target.reagents.add_reagent("regenerative_materia", 5)
|
||||
target.reagents.add_reagent("mindbreaker", 5)
|
||||
target.reagents.add_reagent(/datum/reagent/blob/regenerative_materia, 5)
|
||||
target.reagents.add_reagent(/datum/reagent/toxin/mindbreaker, 5)
|
||||
return TRUE
|
||||
|
||||
/obj/effect/proc_holder/changeling/sting/cryo
|
||||
@@ -262,5 +262,5 @@
|
||||
/obj/effect/proc_holder/changeling/sting/cryo/sting_action(mob/user, mob/target)
|
||||
log_combat(user, target, "stung", "cryo sting")
|
||||
if(target.reagents)
|
||||
target.reagents.add_reagent("frostoil", 30)
|
||||
target.reagents.add_reagent(/datum/reagent/consumable/frostoil, 30)
|
||||
return TRUE
|
||||
|
||||
@@ -100,7 +100,7 @@
|
||||
var/burndamage = L.getFireLoss()
|
||||
var/oxydamage = L.getOxyLoss()
|
||||
var/totaldamage = brutedamage + burndamage + oxydamage
|
||||
if(!totaldamage && (!L.reagents || !L.reagents.has_reagent("holywater")))
|
||||
if(!totaldamage && (!L.reagents || !L.reagents.has_reagent(/datum/reagent/water/holywater)))
|
||||
to_chat(ranged_ability_user, "<span class='inathneq'>\"[L] is unhurt and untainted.\"</span>")
|
||||
return TRUE
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
|
||||
to_chat(ranged_ability_user, "<span class='brass'>You bathe [L == ranged_ability_user ? "yourself":"[L]"] in Inath-neq's power!</span>")
|
||||
var/targetturf = get_turf(L)
|
||||
var/has_holy_water = (L.reagents && L.reagents.has_reagent("holywater"))
|
||||
var/has_holy_water = (L.reagents && L.reagents.has_reagent(/datum/reagent/water/holywater))
|
||||
var/healseverity = max(round(totaldamage*0.05, 1), 1) //shows the general severity of the damage you just healed, 1 glow per 20
|
||||
for(var/i in 1 to healseverity)
|
||||
new /obj/effect/temp_visual/heal(targetturf, "#1E8CE1")
|
||||
@@ -129,7 +129,7 @@
|
||||
playsound(targetturf, 'sound/magic/staff_healing.ogg', 50, 1)
|
||||
|
||||
if(has_holy_water)
|
||||
L.reagents.remove_reagent("holywater", 1000)
|
||||
L.reagents.del_reagent(/datum/reagent/water/holywater)
|
||||
|
||||
remove_ranged_ability()
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
flags_inv = HIDEEARS|HIDEHAIR|HIDEFACE|HIDESNOUT
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
armor = list("melee" = 50, "bullet" = 70, "laser" = -25, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
|
||||
|
||||
/obj/item/clothing/head/helmet/clockwork/Initialize()
|
||||
|
||||
@@ -103,7 +103,7 @@
|
||||
. = ..()
|
||||
addtimer(CALLBACK(src, .proc/check_on_mob, user), 1) //dropped is called before the item is out of the slot, so we need to check slightly later
|
||||
|
||||
/obj/item/clockwork/slab/worn_overlays(isinhands = FALSE, icon_file)
|
||||
/obj/item/clockwork/slab/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
|
||||
. = list()
|
||||
if(isinhands && item_state && inhand_overlay)
|
||||
var/mutable_appearance/M = mutable_appearance(icon_file, "slab_[inhand_overlay]")
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
var/new_thing_type = fabrication_values["new_obj_type"]
|
||||
if(isturf(target)) //if our target is a turf, we're just going to ChangeTurf it and assume it'll work out.
|
||||
var/turf/T = target
|
||||
T.ChangeTurf(new_thing_type)
|
||||
T.ChangeTurf(new_thing_type, flags = CHANGETURF_INHERIT_AIR)
|
||||
else
|
||||
if(new_thing_type)
|
||||
if(fabrication_values["dir_in_new"])
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
if(anchored)
|
||||
T.PlaceOnTop(/turf/closed/wall/clockwork)
|
||||
else
|
||||
T.PlaceOnTop(/turf/open/floor/clockwork)
|
||||
T.PlaceOnTop(/turf/open/floor/clockwork, flags = CHANGETURF_INHERIT_AIR)
|
||||
new /obj/structure/falsewall/brass(T)
|
||||
qdel(src)
|
||||
else
|
||||
|
||||
@@ -331,7 +331,7 @@
|
||||
flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDEEARS|HIDEEYES|HIDESNOUT
|
||||
armor = list("melee" = 30, "bullet" = 30, "laser" = 30,"energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 10, "acid" = 10)
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
|
||||
/obj/item/clothing/suit/magusred
|
||||
name = "magus robes"
|
||||
@@ -424,7 +424,7 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/clothing/suit/hooded/cultrobes/cult_shield/worn_overlays(isinhands)
|
||||
/obj/item/clothing/suit/hooded/cultrobes/cult_shield/worn_overlays(isinhands, icon_file, style_flags = NONE)
|
||||
. = list()
|
||||
if(!isinhands && current_charges)
|
||||
. += mutable_appearance('icons/effects/cult_effects.dmi', "shield-cult", MOB_LAYER + 0.01)
|
||||
@@ -487,7 +487,7 @@
|
||||
icon = 'icons/obj/drinks.dmi'
|
||||
icon_state = "holyflask"
|
||||
color = "#333333"
|
||||
list_reagents = list("unholywater" = 50)
|
||||
list_reagents = list(/datum/reagent/fuel/unholywater = 50)
|
||||
|
||||
/obj/item/shuttle_curse
|
||||
name = "cursed orb"
|
||||
@@ -797,7 +797,7 @@
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
if(H.stat != DEAD)
|
||||
H.reagents.add_reagent("unholywater", 4)
|
||||
H.reagents.add_reagent(/datum/reagent/fuel/unholywater, 4)
|
||||
if(isshade(target) || isconstruct(target))
|
||||
var/mob/living/simple_animal/M = target
|
||||
if(M.health+5 < M.maxHealth)
|
||||
@@ -898,7 +898,7 @@
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
if(H.stat != DEAD)
|
||||
H.reagents.add_reagent("unholywater", 7)
|
||||
H.reagents.add_reagent(/datum/reagent/fuel/unholywater, 7)
|
||||
if(isshade(target) || isconstruct(target))
|
||||
var/mob/living/simple_animal/M = target
|
||||
if(M.health+15 < M.maxHealth)
|
||||
|
||||
@@ -239,9 +239,9 @@
|
||||
var/turf/T = safepick(validturfs)
|
||||
if(T)
|
||||
if(istype(T, /turf/open/floor/plating))
|
||||
T.PlaceOnTop(/turf/open/floor/engine/cult)
|
||||
T.PlaceOnTop(/turf/open/floor/engine/cult, flags = CHANGETURF_INHERIT_AIR)
|
||||
else
|
||||
T.ChangeTurf(/turf/open/floor/engine/cult)
|
||||
T.ChangeTurf(/turf/open/floor/engine/cult, flags = CHANGETURF_INHERIT_AIR)
|
||||
else
|
||||
var/turf/open/floor/engine/cult/F = safepick(cultturfs)
|
||||
if(F)
|
||||
|
||||
@@ -24,11 +24,11 @@ This file contains the cult dagger and rune list code
|
||||
|
||||
/obj/item/melee/cultblade/dagger/attack(mob/living/M, mob/living/user)
|
||||
if(iscultist(M))
|
||||
if(M.reagents && M.reagents.has_reagent("holywater")) //allows cultists to be rescued from the clutches of ordained religion
|
||||
if(M.reagents && M.reagents.has_reagent(/datum/reagent/water/holywater)) //allows cultists to be rescued from the clutches of ordained religion
|
||||
to_chat(user, "<span class='cult'>You remove the taint from [M].</span>" )
|
||||
var/holy2unholy = M.reagents.get_reagent_amount("holywater")
|
||||
M.reagents.del_reagent("holywater")
|
||||
M.reagents.add_reagent("unholywater",holy2unholy)
|
||||
var/holy2unholy = M.reagents.get_reagent_amount(/datum/reagent/water/holywater)
|
||||
M.reagents.del_reagent(/datum/reagent/water/holywater)
|
||||
M.reagents.add_reagent(/datum/reagent/fuel/unholywater,holy2unholy)
|
||||
log_combat(user, M, "smacked", src, " removing the holy water from them")
|
||||
return FALSE
|
||||
. = ..()
|
||||
|
||||
@@ -384,14 +384,14 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
|
||||
if(BANISH_WATER)
|
||||
if(iscarbon(body))
|
||||
var/mob/living/carbon/H = body
|
||||
return H.reagents.has_reagent("holy water")
|
||||
return H.reagents.has_reagent(/datum/reagent/water/holywater)
|
||||
return 0
|
||||
if(BANISH_COFFIN)
|
||||
return (body && istype(body.loc, /obj/structure/closet/crate/coffin))
|
||||
if(BANISH_FORMALDYHIDE)
|
||||
if(iscarbon(body))
|
||||
var/mob/living/carbon/H = body
|
||||
return H.reagents.has_reagent("formaldehyde")
|
||||
return H.reagents.has_reagent(/datum/reagent/toxin/formaldehyde)
|
||||
return 0
|
||||
if(BANISH_RUNES)
|
||||
if(body)
|
||||
|
||||
@@ -5,6 +5,14 @@
|
||||
antagpanel_category = "ClownOp"
|
||||
nukeop_outfit = /datum/outfit/syndicate/clownop
|
||||
|
||||
/datum/antagonist/nukeop/clownop/on_gain()
|
||||
. = ..()
|
||||
ADD_TRAIT(owner, TRAIT_CLOWN_MENTALITY, NUKEOP_ANTAGONIST)
|
||||
|
||||
/datum/antagonist/nukeop/clownop/on_removal()
|
||||
REMOVE_TRAIT(owner, TRAIT_CLOWN_MENTALITY, NUKEOP_ANTAGONIST)
|
||||
return ..()
|
||||
|
||||
/datum/antagonist/nukeop/leader/clownop
|
||||
name = "Clown Operative Leader"
|
||||
roundend_category = "clown operatives"
|
||||
|
||||
@@ -76,9 +76,10 @@ GLOBAL_VAR_INIT(war_declared, FALSE)
|
||||
CONFIG_SET(number/shuttle_refuel_delay, max(CONFIG_GET(number/shuttle_refuel_delay), CHALLENGE_SHUTTLE_DELAY))
|
||||
if(istype(SSticker.mode, /datum/game_mode/dynamic))
|
||||
var/datum/game_mode/dynamic/mode = SSticker.mode
|
||||
var/threat_spent = CONFIG_GET(number/dynamic_warops_cost)
|
||||
mode.spend_threat(threat_spent)
|
||||
mode.log_threat("Nuke ops spent [threat_spent] on war ops.")
|
||||
if(!(mode.storyteller.flags & WAROPS_ALWAYS_ALLOWED))
|
||||
var/threat_spent = CONFIG_GET(number/dynamic_warops_cost)
|
||||
mode.spend_threat(threat_spent)
|
||||
mode.log_threat("Nuke ops spent [threat_spent] on war ops.")
|
||||
SSblackbox.record_feedback("amount", "nuclear_challenge_mode", 1)
|
||||
|
||||
qdel(src)
|
||||
@@ -101,12 +102,13 @@ GLOBAL_VAR_INIT(war_declared, FALSE)
|
||||
return FALSE
|
||||
if(istype(SSticker.mode, /datum/game_mode/dynamic))
|
||||
var/datum/game_mode/dynamic/mode = SSticker.mode
|
||||
if(mode.threat_level < CONFIG_GET(number/dynamic_warops_requirement))
|
||||
to_chat(user, "Due to the dynamic space in which the station resides, you are too deep into Nanotrasen territory to reasonably go loud.")
|
||||
return FALSE
|
||||
else if(mode.threat < CONFIG_GET(number/dynamic_warops_cost))
|
||||
to_chat(user, "Due to recent threats on the station, Nanotrasen is looking too closely for a war declaration to be wise.")
|
||||
return FALSE
|
||||
if(!(mode.storyteller.flags & WAROPS_ALWAYS_ALLOWED))
|
||||
if(mode.threat_level < CONFIG_GET(number/dynamic_warops_requirement))
|
||||
to_chat(user, "Due to the dynamic space in which the station resides, you are too deep into Nanotrasen territory to reasonably go loud.")
|
||||
return FALSE
|
||||
else if(mode.threat < CONFIG_GET(number/dynamic_warops_cost))
|
||||
to_chat(user, "Due to recent threats on the station, Nanotrasen is looking too closely for a war declaration to be wise.")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/item/nuclear_challenge/clownops
|
||||
|
||||
@@ -513,7 +513,7 @@
|
||||
/obj/machinery/nuclearbomb/beer/proc/fizzbuzz()
|
||||
var/datum/reagents/R = new/datum/reagents(1000)
|
||||
R.my_atom = src
|
||||
R.add_reagent("beer", 100)
|
||||
R.add_reagent(/datum/reagent/consumable/ethanol/beer, 100)
|
||||
|
||||
var/datum/effect_system/foam_spread/foam = new
|
||||
foam.set_up(200, get_turf(src), R)
|
||||
|
||||
@@ -1,466 +1,467 @@
|
||||
//Revenants: based off of wraiths from Goon
|
||||
//"Ghosts" that are invisible and move like ghosts, cannot take damage while invisible
|
||||
//Don't hear deadchat and are NOT normal ghosts
|
||||
//Admin-spawn or random event
|
||||
|
||||
#define INVISIBILITY_REVENANT 50
|
||||
#define REVENANT_NAME_FILE "revenant_names.json"
|
||||
|
||||
/mob/living/simple_animal/revenant
|
||||
name = "revenant"
|
||||
desc = "A malevolent spirit."
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
icon_state = "revenant_idle"
|
||||
var/icon_idle = "revenant_idle"
|
||||
var/icon_reveal = "revenant_revealed"
|
||||
var/icon_stun = "revenant_stun"
|
||||
var/icon_drain = "revenant_draining"
|
||||
var/stasis = FALSE
|
||||
mob_biotypes = list(MOB_SPIRIT)
|
||||
incorporeal_move = INCORPOREAL_MOVE_JAUNT
|
||||
invisibility = INVISIBILITY_REVENANT
|
||||
health = INFINITY //Revenants don't use health, they use essence instead
|
||||
maxHealth = INFINITY
|
||||
layer = GHOST_LAYER
|
||||
healable = FALSE
|
||||
spacewalk = TRUE
|
||||
sight = SEE_SELF
|
||||
throwforce = 0
|
||||
|
||||
see_in_dark = 8
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
response_help = "passes through"
|
||||
response_disarm = "swings through"
|
||||
response_harm = "punches through"
|
||||
unsuitable_atmos_damage = 0
|
||||
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) //I don't know how you'd apply those, but revenants no-sell them anyway.
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
maxbodytemp = INFINITY
|
||||
harm_intent_damage = 0
|
||||
friendly = "touches"
|
||||
status_flags = 0
|
||||
wander = FALSE
|
||||
density = FALSE
|
||||
movement_type = FLYING
|
||||
anchored = TRUE
|
||||
mob_size = MOB_SIZE_TINY
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
|
||||
speed = 1
|
||||
unique_name = TRUE
|
||||
hud_possible = list(ANTAG_HUD)
|
||||
hud_type = /datum/hud/revenant
|
||||
|
||||
var/essence = 75 //The resource, and health, of revenants.
|
||||
var/essence_regen_cap = 75 //The regeneration cap of essence (go figure); regenerates every Life() tick up to this amount.
|
||||
var/essence_regenerating = TRUE //If the revenant regenerates essence or not
|
||||
var/essence_regen_amount = 5 //How much essence regenerates
|
||||
var/essence_accumulated = 0 //How much essence the revenant has stolen
|
||||
var/revealed = FALSE //If the revenant can take damage from normal sources.
|
||||
var/unreveal_time = 0 //How long the revenant is revealed for, is about 2 seconds times this var.
|
||||
var/unstun_time = 0 //How long the revenant is stunned for, is about 2 seconds times this var.
|
||||
var/inhibited = FALSE //If the revenant's abilities are blocked by a chaplain's power.
|
||||
var/essence_drained = 0 //How much essence the revenant will drain from the corpse it's feasting on.
|
||||
var/draining = FALSE //If the revenant is draining someone.
|
||||
var/list/drained_mobs = list() //Cannot harvest the same mob twice
|
||||
var/perfectsouls = 0 //How many perfect, regen-cap increasing souls the revenant has. //TODO, add objective for getting a perfect soul(s?)
|
||||
var/generated_objectives_and_spells = FALSE
|
||||
|
||||
/mob/living/simple_animal/revenant/Initialize(mapload)
|
||||
. = ..()
|
||||
AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision/revenant(null))
|
||||
AddSpell(new /obj/effect/proc_holder/spell/targeted/telepathy/revenant(null))
|
||||
AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/defile(null))
|
||||
AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/overload(null))
|
||||
AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/blight(null))
|
||||
AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/malfunction(null))
|
||||
random_revenant_name()
|
||||
|
||||
/mob/living/simple_animal/revenant/proc/random_revenant_name()
|
||||
var/built_name = ""
|
||||
built_name += pick(strings(REVENANT_NAME_FILE, "spirit_type"))
|
||||
built_name += " of "
|
||||
built_name += pick(strings(REVENANT_NAME_FILE, "adverb"))
|
||||
built_name += pick(strings(REVENANT_NAME_FILE, "theme"))
|
||||
name = built_name
|
||||
|
||||
/mob/living/simple_animal/revenant/Login()
|
||||
..()
|
||||
to_chat(src, "<span class='deadsay'><span class='big bold'>You are a revenant.</span></span>")
|
||||
to_chat(src, "<b>Your formerly mundane spirit has been infused with alien energies and empowered into a revenant.</b>")
|
||||
to_chat(src, "<b>You are not dead, not alive, but somewhere in between. You are capable of limited interaction with both worlds.</b>")
|
||||
to_chat(src, "<b>You are invincible and invisible to everyone but other ghosts. Most abilities will reveal you, rendering you vulnerable.</b>")
|
||||
to_chat(src, "<b>To function, you are to drain the life essence from humans. This essence is a resource, as well as your health, and will power all of your abilities.</b>")
|
||||
to_chat(src, "<b><i>You do not remember anything of your past lives, nor will you remember anything about this one after your death.</i></b>")
|
||||
to_chat(src, "<b>Be sure to read <a href=\"https://tgstation13.org/wiki/Revenant\">the wiki page</a> to learn more.</b>")
|
||||
if(!generated_objectives_and_spells)
|
||||
generated_objectives_and_spells = TRUE
|
||||
mind.assigned_role = ROLE_REVENANT
|
||||
mind.special_role = ROLE_REVENANT
|
||||
SEND_SOUND(src, sound('sound/effects/ghost.ogg'))
|
||||
mind.add_antag_datum(/datum/antagonist/revenant)
|
||||
|
||||
//Life, Stat, Hud Updates, and Say
|
||||
/mob/living/simple_animal/revenant/Life()
|
||||
if(stasis)
|
||||
return
|
||||
if(revealed && essence <= 0)
|
||||
death()
|
||||
if(unreveal_time && world.time >= unreveal_time)
|
||||
unreveal_time = 0
|
||||
revealed = FALSE
|
||||
incorporeal_move = INCORPOREAL_MOVE_JAUNT
|
||||
invisibility = INVISIBILITY_REVENANT
|
||||
to_chat(src, "<span class='revenboldnotice'>You are once more concealed.</span>")
|
||||
if(unstun_time && world.time >= unstun_time)
|
||||
unstun_time = 0
|
||||
notransform = FALSE
|
||||
to_chat(src, "<span class='revenboldnotice'>You can move again!</span>")
|
||||
if(essence_regenerating && !inhibited && essence < essence_regen_cap) //While inhibited, essence will not regenerate
|
||||
essence = min(essence_regen_cap, essence+essence_regen_amount)
|
||||
update_action_buttons_icon() //because we update something required by our spells in life, we need to update our buttons
|
||||
update_spooky_icon()
|
||||
update_health_hud()
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/revenant/Stat()
|
||||
..()
|
||||
if(statpanel("Status"))
|
||||
stat(null, "Current essence: [essence]/[essence_regen_cap]E")
|
||||
stat(null, "Stolen essence: [essence_accumulated]E")
|
||||
stat(null, "Stolen perfect souls: [perfectsouls]")
|
||||
|
||||
/mob/living/simple_animal/revenant/update_health_hud()
|
||||
if(hud_used)
|
||||
var/essencecolor = "#8F48C6"
|
||||
if(essence > essence_regen_cap)
|
||||
essencecolor = "#9A5ACB" //oh boy you've got a lot of essence
|
||||
else if(!essence)
|
||||
essencecolor = "#1D2953" //oh jeez you're dying
|
||||
hud_used.healths.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='[essencecolor]'>[essence]E</font></div>"
|
||||
|
||||
/mob/living/simple_animal/revenant/med_hud_set_health()
|
||||
return //we use no hud
|
||||
|
||||
/mob/living/simple_animal/revenant/med_hud_set_status()
|
||||
return //we use no hud
|
||||
|
||||
/mob/living/simple_animal/revenant/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
|
||||
if(!message)
|
||||
return
|
||||
src.log_talk(message, LOG_SAY)
|
||||
var/rendered = "<span class='revennotice'><b>[src]</b> says, \"[message]\"</span>"
|
||||
for(var/mob/M in GLOB.mob_list)
|
||||
if(isrevenant(M))
|
||||
to_chat(M, rendered)
|
||||
else if(isobserver(M))
|
||||
var/link = FOLLOW_LINK(M, src)
|
||||
to_chat(M, "[link] [rendered]")
|
||||
return
|
||||
|
||||
|
||||
//Immunities
|
||||
|
||||
/mob/living/simple_animal/revenant/ex_act(severity, target)
|
||||
return 1 //Immune to the effects of explosions.
|
||||
|
||||
/mob/living/simple_animal/revenant/blob_act(obj/structure/blob/B)
|
||||
return //blah blah blobs aren't in tune with the spirit world, or something.
|
||||
|
||||
/mob/living/simple_animal/revenant/singularity_act()
|
||||
return //don't walk into the singularity expecting to find corpses, okay?
|
||||
|
||||
/mob/living/simple_animal/revenant/narsie_act()
|
||||
return //most humans will now be either bones or harvesters, but we're still un-alive.
|
||||
|
||||
/mob/living/simple_animal/revenant/ratvar_act()
|
||||
return //clocks get out reee
|
||||
|
||||
//damage, gibbing, and dying
|
||||
/mob/living/simple_animal/revenant/attackby(obj/item/W, mob/living/user, params)
|
||||
. = ..()
|
||||
if(istype(W, /obj/item/nullrod))
|
||||
visible_message("<span class='warning'>[src] violently flinches!</span>", \
|
||||
"<span class='revendanger'>As \the [W] passes through you, you feel your essence draining away!</span>")
|
||||
adjustBruteLoss(25) //hella effective
|
||||
inhibited = TRUE
|
||||
update_action_buttons_icon()
|
||||
addtimer(CALLBACK(src, .proc/reset_inhibit), 30)
|
||||
|
||||
/mob/living/simple_animal/revenant/proc/reset_inhibit()
|
||||
inhibited = FALSE
|
||||
update_action_buttons_icon()
|
||||
|
||||
/mob/living/simple_animal/revenant/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
|
||||
if(!forced && !revealed)
|
||||
return FALSE
|
||||
. = amount
|
||||
essence = max(0, essence-amount)
|
||||
if(updating_health)
|
||||
update_health_hud()
|
||||
if(!essence)
|
||||
death()
|
||||
|
||||
/mob/living/simple_animal/revenant/dust(just_ash, drop_items, force)
|
||||
death()
|
||||
|
||||
/mob/living/simple_animal/revenant/gib()
|
||||
death()
|
||||
|
||||
/mob/living/simple_animal/revenant/death()
|
||||
if(!revealed || stasis) //Revenants cannot die if they aren't revealed //or are already dead
|
||||
return 0
|
||||
stasis = TRUE
|
||||
to_chat(src, "<span class='revendanger'>NO! No... it's too late, you can feel your essence [pick("breaking apart", "drifting away")]...</span>")
|
||||
notransform = TRUE
|
||||
revealed = TRUE
|
||||
invisibility = 0
|
||||
playsound(src, 'sound/effects/screech.ogg', 100, 1)
|
||||
visible_message("<span class='warning'>[src] lets out a waning screech as violet mist swirls around its dissolving body!</span>")
|
||||
icon_state = "revenant_draining"
|
||||
for(var/i = alpha, i > 0, i -= 10)
|
||||
stoplag()
|
||||
alpha = i
|
||||
visible_message("<span class='danger'>[src]'s body breaks apart into a fine pile of blue dust.</span>")
|
||||
var/reforming_essence = essence_regen_cap //retain the gained essence capacity
|
||||
var/obj/item/ectoplasm/revenant/R = new(get_turf(src))
|
||||
R.essence = max(reforming_essence - 15 * perfectsouls, 75) //minus any perfect souls
|
||||
R.old_key = client.key //If the essence reforms, the old revenant is put back in the body
|
||||
R.revenant = src
|
||||
invisibility = INVISIBILITY_ABSTRACT
|
||||
revealed = FALSE
|
||||
ghostize(0)//Don't re-enter invisible corpse
|
||||
|
||||
|
||||
//reveal, stun, icon updates, cast checks, and essence changing
|
||||
/mob/living/simple_animal/revenant/proc/reveal(time)
|
||||
if(!src)
|
||||
return
|
||||
if(time <= 0)
|
||||
return
|
||||
revealed = TRUE
|
||||
invisibility = 0
|
||||
incorporeal_move = FALSE
|
||||
if(!unreveal_time)
|
||||
to_chat(src, "<span class='revendanger'>You have been revealed!</span>")
|
||||
unreveal_time = world.time + time
|
||||
else
|
||||
to_chat(src, "<span class='revenwarning'>You have been revealed!</span>")
|
||||
unreveal_time = unreveal_time + time
|
||||
update_spooky_icon()
|
||||
|
||||
/mob/living/simple_animal/revenant/proc/stun(time)
|
||||
if(!src)
|
||||
return
|
||||
if(time <= 0)
|
||||
return
|
||||
notransform = TRUE
|
||||
if(!unstun_time)
|
||||
to_chat(src, "<span class='revendanger'>You cannot move!</span>")
|
||||
unstun_time = world.time + time
|
||||
else
|
||||
to_chat(src, "<span class='revenwarning'>You cannot move!</span>")
|
||||
unstun_time = unstun_time + time
|
||||
update_spooky_icon()
|
||||
|
||||
/mob/living/simple_animal/revenant/proc/update_spooky_icon()
|
||||
if(revealed)
|
||||
if(notransform)
|
||||
if(draining)
|
||||
icon_state = icon_drain
|
||||
else
|
||||
icon_state = icon_stun
|
||||
else
|
||||
icon_state = icon_reveal
|
||||
else
|
||||
icon_state = icon_idle
|
||||
|
||||
/mob/living/simple_animal/revenant/proc/castcheck(essence_cost)
|
||||
if(!src)
|
||||
return
|
||||
var/turf/T = get_turf(src)
|
||||
if(isclosedturf(T))
|
||||
to_chat(src, "<span class='revenwarning'>You cannot use abilities from inside of a wall.</span>")
|
||||
return FALSE
|
||||
for(var/obj/O in T)
|
||||
if(O.density && !O.CanPass(src, T))
|
||||
to_chat(src, "<span class='revenwarning'>You cannot use abilities inside of a dense object.</span>")
|
||||
return FALSE
|
||||
if(inhibited)
|
||||
to_chat(src, "<span class='revenwarning'>Your powers have been suppressed by nulling energy!</span>")
|
||||
return FALSE
|
||||
if(!change_essence_amount(essence_cost, TRUE))
|
||||
to_chat(src, "<span class='revenwarning'>You lack the essence to use that ability.</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/revenant/proc/change_essence_amount(essence_amt, silent = FALSE, source = null)
|
||||
if(!src)
|
||||
return
|
||||
if(essence + essence_amt <= 0)
|
||||
return
|
||||
essence = max(0, essence+essence_amt)
|
||||
update_action_buttons_icon()
|
||||
update_health_hud()
|
||||
if(essence_amt > 0)
|
||||
essence_accumulated = max(0, essence_accumulated+essence_amt)
|
||||
if(!silent)
|
||||
if(essence_amt > 0)
|
||||
to_chat(src, "<span class='revennotice'>Gained [essence_amt]E[source ? " from [source]":""].</span>")
|
||||
else
|
||||
to_chat(src, "<span class='revenminor'>Lost [essence_amt]E[source ? " from [source]":""].</span>")
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/revenant/proc/death_reset()
|
||||
revealed = FALSE
|
||||
unreveal_time = 0
|
||||
notransform = 0
|
||||
unstun_time = 0
|
||||
inhibited = FALSE
|
||||
draining = FALSE
|
||||
incorporeal_move = INCORPOREAL_MOVE_JAUNT
|
||||
invisibility = INVISIBILITY_REVENANT
|
||||
alpha=255
|
||||
stasis = FALSE
|
||||
|
||||
|
||||
//reforming
|
||||
/obj/item/ectoplasm/revenant
|
||||
name = "glimmering residue"
|
||||
desc = "A pile of fine blue dust. Small tendrils of violet mist swirl around it."
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "revenantEctoplasm"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/essence = 75 //the maximum essence of the reforming revenant
|
||||
var/reforming = TRUE
|
||||
var/inert = FALSE
|
||||
var/old_key //key of the previous revenant, will have first pick on reform.
|
||||
var/mob/living/simple_animal/revenant/revenant
|
||||
|
||||
/obj/item/ectoplasm/revenant/New()
|
||||
..()
|
||||
addtimer(CALLBACK(src, .proc/try_reform), 600)
|
||||
|
||||
/obj/item/ectoplasm/revenant/proc/scatter()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/ectoplasm/revenant/proc/try_reform()
|
||||
if(reforming)
|
||||
reforming = FALSE
|
||||
reform()
|
||||
else
|
||||
inert = TRUE
|
||||
visible_message("<span class='warning'>[src] settles down and seems lifeless.</span>")
|
||||
|
||||
/obj/item/ectoplasm/revenant/attack_self(mob/user)
|
||||
if(!reforming || inert)
|
||||
return ..()
|
||||
user.visible_message("<span class='notice'>[user] scatters [src] in all directions.</span>", \
|
||||
"<span class='notice'>You scatter [src] across the area. The particles slowly fade away.</span>")
|
||||
user.dropItemToGround(src)
|
||||
scatter()
|
||||
|
||||
/obj/item/ectoplasm/revenant/throw_impact(atom/hit_atom)
|
||||
..()
|
||||
if(inert)
|
||||
return
|
||||
visible_message("<span class='notice'>[src] breaks into particles upon impact, which fade away to nothingness.</span>")
|
||||
scatter()
|
||||
|
||||
/obj/item/ectoplasm/revenant/examine(mob/user)
|
||||
. = ..()
|
||||
if(inert)
|
||||
. += "<span class='revennotice'>It seems inert.</span>"
|
||||
else if(reforming)
|
||||
. += "<span class='revenwarning'>It is shifting and distorted. It would be wise to destroy this.</span>"
|
||||
|
||||
/obj/item/ectoplasm/revenant/proc/reform()
|
||||
if(QDELETED(src) || QDELETED(revenant) || inert)
|
||||
return
|
||||
var/key_of_revenant = FALSE
|
||||
message_admins("Revenant ectoplasm was left undestroyed for 1 minute and is reforming into a new revenant.")
|
||||
forceMove(drop_location()) //In case it's in a backpack or someone's hand
|
||||
revenant.forceMove(loc)
|
||||
if(old_key)
|
||||
for(var/mob/M in GLOB.dead_mob_list)
|
||||
if(M.client && M.client.key == old_key) //Only recreates the mob if the mob the client is in is dead
|
||||
M.transfer_ckey(revenant.key, FALSE)
|
||||
key_of_revenant = TRUE
|
||||
break
|
||||
if(!key_of_revenant)
|
||||
message_admins("The new revenant's old client either could not be found or is in a new, living mob - grabbing a random candidate instead...")
|
||||
var/list/candidates = pollCandidatesForMob("Do you want to be [revenant.name] (reforming)?", ROLE_REVENANT, null, ROLE_REVENANT, 50, revenant)
|
||||
if(!LAZYLEN(candidates))
|
||||
qdel(revenant)
|
||||
message_admins("No candidates were found for the new revenant. Oh well!")
|
||||
inert = TRUE
|
||||
visible_message("<span class='revenwarning'>[src] settles down and seems lifeless.</span>")
|
||||
return
|
||||
var/mob/dead/observer/C = pick(candidates)
|
||||
C.transfer_ckey(revenant.key, FALSE)
|
||||
if(!revenant.key)
|
||||
qdel(revenant)
|
||||
message_admins("No ckey was found for the new revenant. Oh well!")
|
||||
inert = TRUE
|
||||
visible_message("<span class='revenwarning'>[src] settles down and seems lifeless.</span>")
|
||||
return
|
||||
|
||||
message_admins("[key_of_revenant] has been [old_key == revenant.key ? "re":""]made into a revenant by reforming ectoplasm.")
|
||||
log_game("[key_of_revenant] was [old_key == revenant.key ? "re":""]made as a revenant by reforming ectoplasm.")
|
||||
visible_message("<span class='revenboldnotice'>[src] suddenly rises into the air before fading away.</span>")
|
||||
|
||||
revenant.essence = essence
|
||||
revenant.essence_regen_cap = essence
|
||||
revenant.death_reset()
|
||||
revenant = null
|
||||
qdel(src)
|
||||
|
||||
/obj/item/ectoplasm/revenant/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is inhaling [src]! It looks like [user.p_theyre()] trying to visit the shadow realm!</span>")
|
||||
scatter()
|
||||
return (OXYLOSS)
|
||||
|
||||
/obj/item/ectoplasm/revenant/Destroy()
|
||||
if(!QDELETED(revenant))
|
||||
qdel(revenant)
|
||||
..()
|
||||
|
||||
//objectives
|
||||
/datum/objective/revenant
|
||||
var/targetAmount = 100
|
||||
|
||||
/datum/objective/revenant/New()
|
||||
targetAmount = rand(350,600)
|
||||
explanation_text = "Absorb [targetAmount] points of essence from humans."
|
||||
..()
|
||||
|
||||
/datum/objective/revenant/check_completion()
|
||||
if(!isrevenant(owner.current))
|
||||
return FALSE
|
||||
var/mob/living/simple_animal/revenant/R = owner.current
|
||||
if(!R || R.stat == DEAD)
|
||||
return FALSE
|
||||
var/essence_stolen = R.essence_accumulated
|
||||
if(essence_stolen < targetAmount)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/objective/revenantFluff
|
||||
|
||||
/datum/objective/revenantFluff/New()
|
||||
var/list/explanationTexts = list("Assist and exacerbate existing threats at critical moments.", \
|
||||
"Avoid killing in plain sight.", \
|
||||
"Cause as much chaos and anger as you can without being killed.", \
|
||||
"Damage and render as much of the station rusted and unusable as possible.", \
|
||||
"Disable and cause malfunctions in as many machines as possible.", \
|
||||
"Ensure that any holy weapons are rendered unusable.", \
|
||||
"Hinder the crew while attempting to avoid being noticed.", \
|
||||
"Make the crew as miserable as possible.", \
|
||||
"Make the clown as miserable as possible.", \
|
||||
"Make the captain as miserable as possible.", \
|
||||
"Prevent the use of energy weapons where possible.")
|
||||
explanation_text = pick(explanationTexts)
|
||||
..()
|
||||
|
||||
/datum/objective/revenantFluff/check_completion()
|
||||
return TRUE
|
||||
//Revenants: based off of wraiths from Goon
|
||||
//"Ghosts" that are invisible and move like ghosts, cannot take damage while invisible
|
||||
//Don't hear deadchat and are NOT normal ghosts
|
||||
//Admin-spawn or random event
|
||||
|
||||
#define INVISIBILITY_REVENANT 50
|
||||
#define REVENANT_NAME_FILE "revenant_names.json"
|
||||
|
||||
/mob/living/simple_animal/revenant
|
||||
name = "revenant"
|
||||
desc = "A malevolent spirit."
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
icon_state = "revenant_idle"
|
||||
var/icon_idle = "revenant_idle"
|
||||
var/icon_reveal = "revenant_revealed"
|
||||
var/icon_stun = "revenant_stun"
|
||||
var/icon_drain = "revenant_draining"
|
||||
var/stasis = FALSE
|
||||
mob_biotypes = list(MOB_SPIRIT)
|
||||
incorporeal_move = INCORPOREAL_MOVE_JAUNT
|
||||
invisibility = INVISIBILITY_REVENANT
|
||||
health = INFINITY //Revenants don't use health, they use essence instead
|
||||
maxHealth = INFINITY
|
||||
layer = GHOST_LAYER
|
||||
healable = FALSE
|
||||
spacewalk = TRUE
|
||||
sight = SEE_SELF
|
||||
throwforce = 0
|
||||
blood_volume = 0
|
||||
|
||||
see_in_dark = 8
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
response_help = "passes through"
|
||||
response_disarm = "swings through"
|
||||
response_harm = "punches through"
|
||||
unsuitable_atmos_damage = 0
|
||||
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) //I don't know how you'd apply those, but revenants no-sell them anyway.
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
maxbodytemp = INFINITY
|
||||
harm_intent_damage = 0
|
||||
friendly = "touches"
|
||||
status_flags = 0
|
||||
wander = FALSE
|
||||
density = FALSE
|
||||
movement_type = FLYING
|
||||
anchored = TRUE
|
||||
mob_size = MOB_SIZE_TINY
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
|
||||
speed = 1
|
||||
unique_name = TRUE
|
||||
hud_possible = list(ANTAG_HUD)
|
||||
hud_type = /datum/hud/revenant
|
||||
|
||||
var/essence = 75 //The resource, and health, of revenants.
|
||||
var/essence_regen_cap = 75 //The regeneration cap of essence (go figure); regenerates every Life() tick up to this amount.
|
||||
var/essence_regenerating = TRUE //If the revenant regenerates essence or not
|
||||
var/essence_regen_amount = 5 //How much essence regenerates
|
||||
var/essence_accumulated = 0 //How much essence the revenant has stolen
|
||||
var/revealed = FALSE //If the revenant can take damage from normal sources.
|
||||
var/unreveal_time = 0 //How long the revenant is revealed for, is about 2 seconds times this var.
|
||||
var/unstun_time = 0 //How long the revenant is stunned for, is about 2 seconds times this var.
|
||||
var/inhibited = FALSE //If the revenant's abilities are blocked by a chaplain's power.
|
||||
var/essence_drained = 0 //How much essence the revenant will drain from the corpse it's feasting on.
|
||||
var/draining = FALSE //If the revenant is draining someone.
|
||||
var/list/drained_mobs = list() //Cannot harvest the same mob twice
|
||||
var/perfectsouls = 0 //How many perfect, regen-cap increasing souls the revenant has. //TODO, add objective for getting a perfect soul(s?)
|
||||
var/generated_objectives_and_spells = FALSE
|
||||
|
||||
/mob/living/simple_animal/revenant/Initialize(mapload)
|
||||
. = ..()
|
||||
AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision/revenant(null))
|
||||
AddSpell(new /obj/effect/proc_holder/spell/targeted/telepathy/revenant(null))
|
||||
AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/defile(null))
|
||||
AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/overload(null))
|
||||
AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/blight(null))
|
||||
AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/malfunction(null))
|
||||
random_revenant_name()
|
||||
|
||||
/mob/living/simple_animal/revenant/proc/random_revenant_name()
|
||||
var/built_name = ""
|
||||
built_name += pick(strings(REVENANT_NAME_FILE, "spirit_type"))
|
||||
built_name += " of "
|
||||
built_name += pick(strings(REVENANT_NAME_FILE, "adverb"))
|
||||
built_name += pick(strings(REVENANT_NAME_FILE, "theme"))
|
||||
name = built_name
|
||||
|
||||
/mob/living/simple_animal/revenant/Login()
|
||||
..()
|
||||
to_chat(src, "<span class='deadsay'><span class='big bold'>You are a revenant.</span></span>")
|
||||
to_chat(src, "<b>Your formerly mundane spirit has been infused with alien energies and empowered into a revenant.</b>")
|
||||
to_chat(src, "<b>You are not dead, not alive, but somewhere in between. You are capable of limited interaction with both worlds.</b>")
|
||||
to_chat(src, "<b>You are invincible and invisible to everyone but other ghosts. Most abilities will reveal you, rendering you vulnerable.</b>")
|
||||
to_chat(src, "<b>To function, you are to drain the life essence from humans. This essence is a resource, as well as your health, and will power all of your abilities.</b>")
|
||||
to_chat(src, "<b><i>You do not remember anything of your past lives, nor will you remember anything about this one after your death.</i></b>")
|
||||
to_chat(src, "<b>Be sure to read <a href=\"https://tgstation13.org/wiki/Revenant\">the wiki page</a> to learn more.</b>")
|
||||
if(!generated_objectives_and_spells)
|
||||
generated_objectives_and_spells = TRUE
|
||||
mind.assigned_role = ROLE_REVENANT
|
||||
mind.special_role = ROLE_REVENANT
|
||||
SEND_SOUND(src, sound('sound/effects/ghost.ogg'))
|
||||
mind.add_antag_datum(/datum/antagonist/revenant)
|
||||
|
||||
//Life, Stat, Hud Updates, and Say
|
||||
/mob/living/simple_animal/revenant/Life()
|
||||
if(stasis)
|
||||
return
|
||||
if(revealed && essence <= 0)
|
||||
death()
|
||||
if(unreveal_time && world.time >= unreveal_time)
|
||||
unreveal_time = 0
|
||||
revealed = FALSE
|
||||
incorporeal_move = INCORPOREAL_MOVE_JAUNT
|
||||
invisibility = INVISIBILITY_REVENANT
|
||||
to_chat(src, "<span class='revenboldnotice'>You are once more concealed.</span>")
|
||||
if(unstun_time && world.time >= unstun_time)
|
||||
unstun_time = 0
|
||||
notransform = FALSE
|
||||
to_chat(src, "<span class='revenboldnotice'>You can move again!</span>")
|
||||
if(essence_regenerating && !inhibited && essence < essence_regen_cap) //While inhibited, essence will not regenerate
|
||||
essence = min(essence_regen_cap, essence+essence_regen_amount)
|
||||
update_action_buttons_icon() //because we update something required by our spells in life, we need to update our buttons
|
||||
update_spooky_icon()
|
||||
update_health_hud()
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/revenant/Stat()
|
||||
..()
|
||||
if(statpanel("Status"))
|
||||
stat(null, "Current essence: [essence]/[essence_regen_cap]E")
|
||||
stat(null, "Stolen essence: [essence_accumulated]E")
|
||||
stat(null, "Stolen perfect souls: [perfectsouls]")
|
||||
|
||||
/mob/living/simple_animal/revenant/update_health_hud()
|
||||
if(hud_used)
|
||||
var/essencecolor = "#8F48C6"
|
||||
if(essence > essence_regen_cap)
|
||||
essencecolor = "#9A5ACB" //oh boy you've got a lot of essence
|
||||
else if(!essence)
|
||||
essencecolor = "#1D2953" //oh jeez you're dying
|
||||
hud_used.healths.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='[essencecolor]'>[essence]E</font></div>"
|
||||
|
||||
/mob/living/simple_animal/revenant/med_hud_set_health()
|
||||
return //we use no hud
|
||||
|
||||
/mob/living/simple_animal/revenant/med_hud_set_status()
|
||||
return //we use no hud
|
||||
|
||||
/mob/living/simple_animal/revenant/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
|
||||
if(!message)
|
||||
return
|
||||
src.log_talk(message, LOG_SAY)
|
||||
var/rendered = "<span class='revennotice'><b>[src]</b> says, \"[message]\"</span>"
|
||||
for(var/mob/M in GLOB.mob_list)
|
||||
if(isrevenant(M))
|
||||
to_chat(M, rendered)
|
||||
else if(isobserver(M))
|
||||
var/link = FOLLOW_LINK(M, src)
|
||||
to_chat(M, "[link] [rendered]")
|
||||
return
|
||||
|
||||
|
||||
//Immunities
|
||||
|
||||
/mob/living/simple_animal/revenant/ex_act(severity, target)
|
||||
return 1 //Immune to the effects of explosions.
|
||||
|
||||
/mob/living/simple_animal/revenant/blob_act(obj/structure/blob/B)
|
||||
return //blah blah blobs aren't in tune with the spirit world, or something.
|
||||
|
||||
/mob/living/simple_animal/revenant/singularity_act()
|
||||
return //don't walk into the singularity expecting to find corpses, okay?
|
||||
|
||||
/mob/living/simple_animal/revenant/narsie_act()
|
||||
return //most humans will now be either bones or harvesters, but we're still un-alive.
|
||||
|
||||
/mob/living/simple_animal/revenant/ratvar_act()
|
||||
return //clocks get out reee
|
||||
|
||||
//damage, gibbing, and dying
|
||||
/mob/living/simple_animal/revenant/attackby(obj/item/W, mob/living/user, params)
|
||||
. = ..()
|
||||
if(istype(W, /obj/item/nullrod))
|
||||
visible_message("<span class='warning'>[src] violently flinches!</span>", \
|
||||
"<span class='revendanger'>As \the [W] passes through you, you feel your essence draining away!</span>")
|
||||
adjustBruteLoss(25) //hella effective
|
||||
inhibited = TRUE
|
||||
update_action_buttons_icon()
|
||||
addtimer(CALLBACK(src, .proc/reset_inhibit), 30)
|
||||
|
||||
/mob/living/simple_animal/revenant/proc/reset_inhibit()
|
||||
inhibited = FALSE
|
||||
update_action_buttons_icon()
|
||||
|
||||
/mob/living/simple_animal/revenant/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
|
||||
if(!forced && !revealed)
|
||||
return FALSE
|
||||
. = amount
|
||||
essence = max(0, essence-amount)
|
||||
if(updating_health)
|
||||
update_health_hud()
|
||||
if(!essence)
|
||||
death()
|
||||
|
||||
/mob/living/simple_animal/revenant/dust(just_ash, drop_items, force)
|
||||
death()
|
||||
|
||||
/mob/living/simple_animal/revenant/gib()
|
||||
death()
|
||||
|
||||
/mob/living/simple_animal/revenant/death()
|
||||
if(!revealed || stasis) //Revenants cannot die if they aren't revealed //or are already dead
|
||||
return 0
|
||||
stasis = TRUE
|
||||
to_chat(src, "<span class='revendanger'>NO! No... it's too late, you can feel your essence [pick("breaking apart", "drifting away")]...</span>")
|
||||
notransform = TRUE
|
||||
revealed = TRUE
|
||||
invisibility = 0
|
||||
playsound(src, 'sound/effects/screech.ogg', 100, 1)
|
||||
visible_message("<span class='warning'>[src] lets out a waning screech as violet mist swirls around its dissolving body!</span>")
|
||||
icon_state = "revenant_draining"
|
||||
for(var/i = alpha, i > 0, i -= 10)
|
||||
stoplag()
|
||||
alpha = i
|
||||
visible_message("<span class='danger'>[src]'s body breaks apart into a fine pile of blue dust.</span>")
|
||||
var/reforming_essence = essence_regen_cap //retain the gained essence capacity
|
||||
var/obj/item/ectoplasm/revenant/R = new(get_turf(src))
|
||||
R.essence = max(reforming_essence - 15 * perfectsouls, 75) //minus any perfect souls
|
||||
R.old_key = client.key //If the essence reforms, the old revenant is put back in the body
|
||||
R.revenant = src
|
||||
invisibility = INVISIBILITY_ABSTRACT
|
||||
revealed = FALSE
|
||||
ghostize(0)//Don't re-enter invisible corpse
|
||||
|
||||
|
||||
//reveal, stun, icon updates, cast checks, and essence changing
|
||||
/mob/living/simple_animal/revenant/proc/reveal(time)
|
||||
if(!src)
|
||||
return
|
||||
if(time <= 0)
|
||||
return
|
||||
revealed = TRUE
|
||||
invisibility = 0
|
||||
incorporeal_move = FALSE
|
||||
if(!unreveal_time)
|
||||
to_chat(src, "<span class='revendanger'>You have been revealed!</span>")
|
||||
unreveal_time = world.time + time
|
||||
else
|
||||
to_chat(src, "<span class='revenwarning'>You have been revealed!</span>")
|
||||
unreveal_time = unreveal_time + time
|
||||
update_spooky_icon()
|
||||
|
||||
/mob/living/simple_animal/revenant/proc/stun(time)
|
||||
if(!src)
|
||||
return
|
||||
if(time <= 0)
|
||||
return
|
||||
notransform = TRUE
|
||||
if(!unstun_time)
|
||||
to_chat(src, "<span class='revendanger'>You cannot move!</span>")
|
||||
unstun_time = world.time + time
|
||||
else
|
||||
to_chat(src, "<span class='revenwarning'>You cannot move!</span>")
|
||||
unstun_time = unstun_time + time
|
||||
update_spooky_icon()
|
||||
|
||||
/mob/living/simple_animal/revenant/proc/update_spooky_icon()
|
||||
if(revealed)
|
||||
if(notransform)
|
||||
if(draining)
|
||||
icon_state = icon_drain
|
||||
else
|
||||
icon_state = icon_stun
|
||||
else
|
||||
icon_state = icon_reveal
|
||||
else
|
||||
icon_state = icon_idle
|
||||
|
||||
/mob/living/simple_animal/revenant/proc/castcheck(essence_cost)
|
||||
if(!src)
|
||||
return
|
||||
var/turf/T = get_turf(src)
|
||||
if(isclosedturf(T))
|
||||
to_chat(src, "<span class='revenwarning'>You cannot use abilities from inside of a wall.</span>")
|
||||
return FALSE
|
||||
for(var/obj/O in T)
|
||||
if(O.density && !O.CanPass(src, T))
|
||||
to_chat(src, "<span class='revenwarning'>You cannot use abilities inside of a dense object.</span>")
|
||||
return FALSE
|
||||
if(inhibited)
|
||||
to_chat(src, "<span class='revenwarning'>Your powers have been suppressed by nulling energy!</span>")
|
||||
return FALSE
|
||||
if(!change_essence_amount(essence_cost, TRUE))
|
||||
to_chat(src, "<span class='revenwarning'>You lack the essence to use that ability.</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/revenant/proc/change_essence_amount(essence_amt, silent = FALSE, source = null)
|
||||
if(!src)
|
||||
return
|
||||
if(essence + essence_amt <= 0)
|
||||
return
|
||||
essence = max(0, essence+essence_amt)
|
||||
update_action_buttons_icon()
|
||||
update_health_hud()
|
||||
if(essence_amt > 0)
|
||||
essence_accumulated = max(0, essence_accumulated+essence_amt)
|
||||
if(!silent)
|
||||
if(essence_amt > 0)
|
||||
to_chat(src, "<span class='revennotice'>Gained [essence_amt]E[source ? " from [source]":""].</span>")
|
||||
else
|
||||
to_chat(src, "<span class='revenminor'>Lost [essence_amt]E[source ? " from [source]":""].</span>")
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/revenant/proc/death_reset()
|
||||
revealed = FALSE
|
||||
unreveal_time = 0
|
||||
notransform = 0
|
||||
unstun_time = 0
|
||||
inhibited = FALSE
|
||||
draining = FALSE
|
||||
incorporeal_move = INCORPOREAL_MOVE_JAUNT
|
||||
invisibility = INVISIBILITY_REVENANT
|
||||
alpha=255
|
||||
stasis = FALSE
|
||||
|
||||
|
||||
//reforming
|
||||
/obj/item/ectoplasm/revenant
|
||||
name = "glimmering residue"
|
||||
desc = "A pile of fine blue dust. Small tendrils of violet mist swirl around it."
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "revenantEctoplasm"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/essence = 75 //the maximum essence of the reforming revenant
|
||||
var/reforming = TRUE
|
||||
var/inert = FALSE
|
||||
var/old_key //key of the previous revenant, will have first pick on reform.
|
||||
var/mob/living/simple_animal/revenant/revenant
|
||||
|
||||
/obj/item/ectoplasm/revenant/New()
|
||||
..()
|
||||
addtimer(CALLBACK(src, .proc/try_reform), 600)
|
||||
|
||||
/obj/item/ectoplasm/revenant/proc/scatter()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/ectoplasm/revenant/proc/try_reform()
|
||||
if(reforming)
|
||||
reforming = FALSE
|
||||
reform()
|
||||
else
|
||||
inert = TRUE
|
||||
visible_message("<span class='warning'>[src] settles down and seems lifeless.</span>")
|
||||
|
||||
/obj/item/ectoplasm/revenant/attack_self(mob/user)
|
||||
if(!reforming || inert)
|
||||
return ..()
|
||||
user.visible_message("<span class='notice'>[user] scatters [src] in all directions.</span>", \
|
||||
"<span class='notice'>You scatter [src] across the area. The particles slowly fade away.</span>")
|
||||
user.dropItemToGround(src)
|
||||
scatter()
|
||||
|
||||
/obj/item/ectoplasm/revenant/throw_impact(atom/hit_atom)
|
||||
..()
|
||||
if(inert)
|
||||
return
|
||||
visible_message("<span class='notice'>[src] breaks into particles upon impact, which fade away to nothingness.</span>")
|
||||
scatter()
|
||||
|
||||
/obj/item/ectoplasm/revenant/examine(mob/user)
|
||||
. = ..()
|
||||
if(inert)
|
||||
. += "<span class='revennotice'>It seems inert.</span>"
|
||||
else if(reforming)
|
||||
. += "<span class='revenwarning'>It is shifting and distorted. It would be wise to destroy this.</span>"
|
||||
|
||||
/obj/item/ectoplasm/revenant/proc/reform()
|
||||
if(QDELETED(src) || QDELETED(revenant) || inert)
|
||||
return
|
||||
var/key_of_revenant = FALSE
|
||||
message_admins("Revenant ectoplasm was left undestroyed for 1 minute and is reforming into a new revenant.")
|
||||
forceMove(drop_location()) //In case it's in a backpack or someone's hand
|
||||
revenant.forceMove(loc)
|
||||
if(old_key)
|
||||
for(var/mob/M in GLOB.dead_mob_list)
|
||||
if(M.client && M.client.key == old_key) //Only recreates the mob if the mob the client is in is dead
|
||||
M.transfer_ckey(revenant.key, FALSE)
|
||||
key_of_revenant = TRUE
|
||||
break
|
||||
if(!key_of_revenant)
|
||||
message_admins("The new revenant's old client either could not be found or is in a new, living mob - grabbing a random candidate instead...")
|
||||
var/list/candidates = pollCandidatesForMob("Do you want to be [revenant.name] (reforming)?", ROLE_REVENANT, null, ROLE_REVENANT, 50, revenant)
|
||||
if(!LAZYLEN(candidates))
|
||||
qdel(revenant)
|
||||
message_admins("No candidates were found for the new revenant. Oh well!")
|
||||
inert = TRUE
|
||||
visible_message("<span class='revenwarning'>[src] settles down and seems lifeless.</span>")
|
||||
return
|
||||
var/mob/dead/observer/C = pick(candidates)
|
||||
C.transfer_ckey(revenant.key, FALSE)
|
||||
if(!revenant.key)
|
||||
qdel(revenant)
|
||||
message_admins("No ckey was found for the new revenant. Oh well!")
|
||||
inert = TRUE
|
||||
visible_message("<span class='revenwarning'>[src] settles down and seems lifeless.</span>")
|
||||
return
|
||||
|
||||
message_admins("[key_of_revenant] has been [old_key == revenant.key ? "re":""]made into a revenant by reforming ectoplasm.")
|
||||
log_game("[key_of_revenant] was [old_key == revenant.key ? "re":""]made as a revenant by reforming ectoplasm.")
|
||||
visible_message("<span class='revenboldnotice'>[src] suddenly rises into the air before fading away.</span>")
|
||||
|
||||
revenant.essence = essence
|
||||
revenant.essence_regen_cap = essence
|
||||
revenant.death_reset()
|
||||
revenant = null
|
||||
qdel(src)
|
||||
|
||||
/obj/item/ectoplasm/revenant/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is inhaling [src]! It looks like [user.p_theyre()] trying to visit the shadow realm!</span>")
|
||||
scatter()
|
||||
return (OXYLOSS)
|
||||
|
||||
/obj/item/ectoplasm/revenant/Destroy()
|
||||
if(!QDELETED(revenant))
|
||||
qdel(revenant)
|
||||
..()
|
||||
|
||||
//objectives
|
||||
/datum/objective/revenant
|
||||
var/targetAmount = 100
|
||||
|
||||
/datum/objective/revenant/New()
|
||||
targetAmount = rand(350,600)
|
||||
explanation_text = "Absorb [targetAmount] points of essence from humans."
|
||||
..()
|
||||
|
||||
/datum/objective/revenant/check_completion()
|
||||
if(!isrevenant(owner.current))
|
||||
return FALSE
|
||||
var/mob/living/simple_animal/revenant/R = owner.current
|
||||
if(!R || R.stat == DEAD)
|
||||
return FALSE
|
||||
var/essence_stolen = R.essence_accumulated
|
||||
if(essence_stolen < targetAmount)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/objective/revenantFluff
|
||||
|
||||
/datum/objective/revenantFluff/New()
|
||||
var/list/explanationTexts = list("Assist and exacerbate existing threats at critical moments.", \
|
||||
"Avoid killing in plain sight.", \
|
||||
"Cause as much chaos and anger as you can without being killed.", \
|
||||
"Damage and render as much of the station rusted and unusable as possible.", \
|
||||
"Disable and cause malfunctions in as many machines as possible.", \
|
||||
"Ensure that any holy weapons are rendered unusable.", \
|
||||
"Hinder the crew while attempting to avoid being noticed.", \
|
||||
"Make the crew as miserable as possible.", \
|
||||
"Make the clown as miserable as possible.", \
|
||||
"Make the captain as miserable as possible.", \
|
||||
"Prevent the use of energy weapons where possible.")
|
||||
explanation_text = pick(explanationTexts)
|
||||
..()
|
||||
|
||||
/datum/objective/revenantFluff/check_completion()
|
||||
return TRUE
|
||||
|
||||
@@ -353,7 +353,7 @@
|
||||
to_chat(H, "<span class='revenminor'>You feel [pick("suddenly sick", "a surge of nausea", "like your skin is <i>wrong</i>")].</span>")
|
||||
else
|
||||
if(mob.reagents)
|
||||
mob.reagents.add_reagent("plasma", 5)
|
||||
mob.reagents.add_reagent(/datum/reagent/toxin/plasma, 5)
|
||||
else
|
||||
mob.adjustToxLoss(5)
|
||||
for(var/obj/structure/spacevine/vine in T) //Fucking with botanists, the ability.
|
||||
|
||||
@@ -80,6 +80,8 @@
|
||||
if(istype(SSticker.mode,/datum/game_mode/dynamic))
|
||||
mode = SSticker.mode
|
||||
is_dynamic = TRUE
|
||||
if(mode.storyteller.flags & NO_ASSASSIN)
|
||||
is_hijacker = FALSE
|
||||
if(GLOB.joined_player_list.len>=GLOB.dynamic_high_pop_limit)
|
||||
is_hijacker = (prob(10) && mode.threat_level > CONFIG_GET(number/dynamic_hijack_high_population_requirement))
|
||||
else
|
||||
@@ -180,7 +182,7 @@
|
||||
destroy_objective.owner = owner
|
||||
destroy_objective.find_target()
|
||||
add_objective(destroy_objective)
|
||||
else if(prob(30))
|
||||
else if(prob(30) || (is_dynamic && (mode.storyteller.flags & NO_ASSASSIN)))
|
||||
var/datum/objective/maroon/maroon_objective = new
|
||||
maroon_objective.owner = owner
|
||||
maroon_objective.find_target()
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
/obj/item/assembly/playback
|
||||
name = "playback device"
|
||||
desc = "A small electronic device able to record a voice sample, and repeat that sample when it receive a signal."
|
||||
icon_state = "radio"
|
||||
materials = list(MAT_METAL=500, MAT_GLASS=50)
|
||||
flags_1 = HEAR_1
|
||||
attachable = TRUE
|
||||
verb_say = "beeps"
|
||||
verb_ask = "beeps"
|
||||
verb_exclaim = "beeps"
|
||||
var/listening = FALSE
|
||||
var/recorded = "" //the activation message
|
||||
var/languages
|
||||
|
||||
/obj/item/assembly/playback/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source)
|
||||
. = ..()
|
||||
if(speaker == src)
|
||||
return
|
||||
|
||||
if(listening && !radio_freq)
|
||||
record_speech(speaker, raw_message, message_language)
|
||||
|
||||
/obj/item/assembly/playback/proc/record_speech(atom/movable/speaker, raw_message, datum/language/message_language)
|
||||
recorded = raw_message
|
||||
listening = FALSE
|
||||
languages = message_language
|
||||
say("Activation message is '[recorded]'.", language = message_language)
|
||||
|
||||
/obj/item/assembly/playback/activate()
|
||||
if(recorded == "") // Why say anything when there isn't anything to say
|
||||
return FALSE
|
||||
say("[recorded]", language = languages) // Repeat the message in the language it was said in
|
||||
return TRUE
|
||||
|
||||
/obj/item/assembly/playback/proc/record()
|
||||
if(!secured || holder)
|
||||
return FALSE
|
||||
listening = !listening
|
||||
say("[listening ? "Now" : "No longer"] recording input.")
|
||||
return TRUE
|
||||
|
||||
/obj/item/assembly/playback/attack_self(mob/user)
|
||||
if(!user)
|
||||
return FALSE
|
||||
record()
|
||||
return TRUE
|
||||
|
||||
/obj/item/assembly/playback/toggle_secure()
|
||||
. = ..()
|
||||
listening = FALSE
|
||||
@@ -15,6 +15,7 @@
|
||||
verb_exclaim = "beeps"
|
||||
var/listening = FALSE
|
||||
var/recorded = "" //the activation message
|
||||
var/languages // The Message's language
|
||||
var/mode = 1
|
||||
var/static/list/modes = list("inclusive",
|
||||
"exclusive",
|
||||
@@ -33,23 +34,25 @@
|
||||
if(listening && !radio_freq)
|
||||
record_speech(speaker, raw_message, message_language)
|
||||
else
|
||||
if(check_activation(speaker, raw_message))
|
||||
addtimer(CALLBACK(src, .proc/pulse, 0), 10)
|
||||
if(message_language == languages) // If it isn't in the same language as the message, don't try to find the message
|
||||
if(check_activation(speaker, raw_message))
|
||||
addtimer(CALLBACK(src, .proc/pulse, 0), 10)
|
||||
|
||||
/obj/item/assembly/voice/proc/record_speech(atom/movable/speaker, raw_message, datum/language/message_language)
|
||||
languages = message_language // Assign the message's language to a variable to use it elsewhere
|
||||
switch(mode)
|
||||
if(INCLUSIVE_MODE)
|
||||
recorded = raw_message
|
||||
listening = FALSE
|
||||
say("Activation message is '[recorded]'.", message_language)
|
||||
say("Activation message is '[recorded]'.", language = languages) // Say the message in the language it was said in
|
||||
if(EXCLUSIVE_MODE)
|
||||
recorded = raw_message
|
||||
listening = FALSE
|
||||
say("Activation message is '[recorded]'.", message_language)
|
||||
say("Activation message is '[recorded]'.", language = languages)
|
||||
if(RECOGNIZER_MODE)
|
||||
recorded = speaker.GetVoice()
|
||||
listening = FALSE
|
||||
say("Your voice pattern is saved.", message_language)
|
||||
say("Your voice pattern is saved.", language = languages)
|
||||
if(VOICE_SENSOR_MODE)
|
||||
if(length(raw_message))
|
||||
addtimer(CALLBACK(src, .proc/pulse, 0), 10)
|
||||
|
||||
@@ -358,6 +358,9 @@
|
||||
SSair.excited_groups -= src
|
||||
|
||||
////////////////////////SUPERCONDUCTIVITY/////////////////////////////
|
||||
/atom/movable/proc/blocksTemperature()
|
||||
return FALSE
|
||||
|
||||
/turf/proc/conductivity_directions()
|
||||
if(archived_cycle < SSair.times_fired)
|
||||
archive()
|
||||
@@ -372,6 +375,9 @@
|
||||
. |= direction
|
||||
|
||||
/turf/proc/neighbor_conduct_with_src(turf/open/other)
|
||||
for (var/atom/movable/G in src)
|
||||
if (G.blocksTemperature())
|
||||
return
|
||||
if(!other.blocks_air) //Open but neighbor is solid
|
||||
other.temperature_share_open_to_solid(src)
|
||||
else //Both tiles are solid
|
||||
@@ -382,7 +388,9 @@
|
||||
if(blocks_air)
|
||||
..()
|
||||
return
|
||||
|
||||
for (var/atom/movable/G in src)
|
||||
if (G.blocksTemperature())
|
||||
return
|
||||
if(!other.blocks_air) //Both tiles are open
|
||||
var/turf/open/T = other
|
||||
T.air.temperature_share(air, WINDOW_HEAT_TRANSFER_COEFFICIENT)
|
||||
@@ -401,10 +409,8 @@
|
||||
|
||||
if(!neighbor.thermal_conductivity)
|
||||
continue
|
||||
|
||||
if(neighbor.archived_cycle < SSair.times_fired)
|
||||
neighbor.archive()
|
||||
|
||||
neighbor.neighbor_conduct_with_src(src)
|
||||
|
||||
neighbor.consider_superconductivity()
|
||||
|
||||
@@ -61,8 +61,6 @@
|
||||
//Actually transfer the gas
|
||||
var/datum/gas_mixture/removed = air2.remove(transfer_moles)
|
||||
|
||||
removed.react(src)
|
||||
|
||||
update_parents()
|
||||
|
||||
return removed
|
||||
|
||||
@@ -57,10 +57,10 @@
|
||||
if(item.parent)
|
||||
var/static/pipenetwarnings = 10
|
||||
if(pipenetwarnings > 0)
|
||||
warning("build_pipeline(): [item.type] added to a pipenet while still having one. (pipes leading to the same spot stacking in one turf) Nearby: ([item.x], [item.y], [item.z])")
|
||||
log_mapping("build_pipeline(): [item.type] added to a pipenet while still having one. (pipes leading to the same spot stacking in one turf) Nearby: ([item.x], [item.y], [item.z]).")
|
||||
pipenetwarnings -= 1
|
||||
if(pipenetwarnings == 0)
|
||||
warning("build_pipeline(): further messages about pipenets will be suppressed")
|
||||
log_mapping("build_pipeline(): further messages about pipenets will be suppressed")
|
||||
members += item
|
||||
possible_expansions += item
|
||||
|
||||
@@ -154,11 +154,6 @@
|
||||
var/partial_heat_capacity = total_heat_capacity*(share_volume/air.volume)
|
||||
var/target_temperature
|
||||
var/target_heat_capacity
|
||||
// first calculate heat from radiation. there's an implied "* 1 tick" here.
|
||||
// 0.05 magic multiplicand is, first, 0.1 deciseconds; second, half of the radiation's going right back into the gas.
|
||||
var/share_constant = STEFANBOLTZMANN*(share_volume**(2/3))*0.05
|
||||
// Minimizing temp to 4 billion is mostly to prevent -infinity temperatures.
|
||||
var/heat = share_constant*(min(air.temperature,4000000000)**4)
|
||||
|
||||
if(isopenturf(target))
|
||||
|
||||
@@ -170,8 +165,8 @@
|
||||
|
||||
if((modeled_location.heat_capacity>0) && (partial_heat_capacity>0))
|
||||
var/delta_temperature = air.temperature - target_temperature
|
||||
heat -= share_constant*(min(target_temperature,4000000000)**4)
|
||||
heat += thermal_conductivity*delta_temperature* \
|
||||
|
||||
var/heat = thermal_conductivity*delta_temperature* \
|
||||
(partial_heat_capacity*target_heat_capacity/(partial_heat_capacity+target_heat_capacity))
|
||||
|
||||
air.temperature -= heat/total_heat_capacity
|
||||
@@ -188,8 +183,7 @@
|
||||
var/sharer_temperature_delta = 0
|
||||
|
||||
if((sharer_heat_capacity>0) && (partial_heat_capacity>0))
|
||||
heat -= share_constant*(min(target_temperature,4000000000)**4)
|
||||
heat += thermal_conductivity*delta_temperature* \
|
||||
var/heat = thermal_conductivity*delta_temperature* \
|
||||
(partial_heat_capacity*sharer_heat_capacity/(partial_heat_capacity+sharer_heat_capacity))
|
||||
|
||||
self_temperature_delta = -heat/total_heat_capacity
|
||||
@@ -205,12 +199,10 @@
|
||||
if((target.heat_capacity>0) && (partial_heat_capacity>0))
|
||||
var/delta_temperature = air.temperature - target.temperature
|
||||
|
||||
heat -= share_constant*(min(target.temperature,4000000000)**4)
|
||||
heat += thermal_conductivity*delta_temperature* \
|
||||
var/heat = thermal_conductivity*delta_temperature* \
|
||||
(partial_heat_capacity*target.heat_capacity/(partial_heat_capacity+target.heat_capacity))
|
||||
|
||||
air.temperature -= heat/total_heat_capacity
|
||||
air.temperature = CLAMP(air.temperature,TCMB,INFINITY) // i have no idea why TCMB needs to be the min but i ain't changing it
|
||||
update = TRUE
|
||||
|
||||
/datum/pipeline/proc/return_air()
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
pixel_y = (new_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y
|
||||
|
||||
/obj/machinery/meter/process_atmos()
|
||||
if(!target)
|
||||
if(!(target?.flags_1 & INITIALIZED_1))
|
||||
icon_state = "meterX"
|
||||
return 0
|
||||
|
||||
|
||||
@@ -26,7 +26,9 @@
|
||||
|
||||
var/turf/T = loc
|
||||
if(istype(T))
|
||||
if(T.blocks_air)
|
||||
if(islava(T))
|
||||
environment_temperature = 5000
|
||||
else if(T.blocks_air)
|
||||
environment_temperature = T.temperature
|
||||
else
|
||||
var/turf/open/OT = T
|
||||
|
||||
@@ -175,7 +175,7 @@
|
||||
if(C.reagents.total_volume >= C.volume)
|
||||
to_chat(user, "<span class='danger'>[C] is full.</span>")
|
||||
return
|
||||
C.reagents.add_reagent("plasma", rand(5, 10))
|
||||
C.reagents.add_reagent(/datum/reagent/toxin/plasma, rand(5, 10))
|
||||
user.visible_message("[user] scoops some plasma from the [src] with \the [C].", "<span class='notice'>You scoop out some plasma from the [src] using \the [C].</span>")
|
||||
|
||||
/turf/open/lava/plasma/burn_stuff(AM)
|
||||
@@ -488,8 +488,7 @@
|
||||
/obj/item/grenade/clusterbuster/smoke = 15,
|
||||
/obj/item/clothing/under/chameleon = 13,
|
||||
/obj/item/clothing/shoes/chameleon/noslip = 10,
|
||||
/obj/item/borg/upgrade/ddrill = 3,
|
||||
/obj/item/borg/upgrade/soh = 3)
|
||||
/obj/item/borg/upgrade/ddrill = 3)
|
||||
|
||||
/obj/effect/spawner/lootdrop/snowdin/dungeonmid
|
||||
name = "dungeon mid"
|
||||
|
||||
@@ -22,9 +22,9 @@
|
||||
if(istype(object,/turf) && left_click && !alt_click && !ctrl_click)
|
||||
var/turf/T = object
|
||||
if(isspaceturf(object))
|
||||
T.PlaceOnTop(/turf/open/floor/plating)
|
||||
T.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR)
|
||||
else if(isplatingturf(object))
|
||||
T.PlaceOnTop(/turf/open/floor/plasteel)
|
||||
T.PlaceOnTop(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR)
|
||||
else if(isfloorturf(object))
|
||||
T.PlaceOnTop(/turf/closed/wall)
|
||||
else if(iswallturf(object))
|
||||
@@ -35,7 +35,7 @@
|
||||
log_admin("Build Mode: [key_name(c)] deleted [object] at [AREACOORD(object)]")
|
||||
if(isturf(object))
|
||||
var/turf/T = object
|
||||
T.ScrapeAway()
|
||||
T.ScrapeAway(flags = CHANGETURF_INHERIT_AIR)
|
||||
else if(isobj(object))
|
||||
qdel(object)
|
||||
return
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
/datum/bounty/reagent/applies_to(obj/O)
|
||||
if(!istype(O, /obj/item/reagent_containers))
|
||||
return FALSE
|
||||
if(!O.reagents || !O.reagents.has_reagent(wanted_reagent.id))
|
||||
if(!O.reagents || !O.reagents.has_reagent(wanted_reagent.type))
|
||||
return FALSE
|
||||
if(O.flags_1 & HOLOGRAM_1)
|
||||
return FALSE
|
||||
@@ -21,7 +21,7 @@
|
||||
/datum/bounty/reagent/ship(obj/O)
|
||||
if(!applies_to(O))
|
||||
return
|
||||
shipped_volume += O.reagents.get_reagent_amount(wanted_reagent.id)
|
||||
shipped_volume += O.reagents.get_reagent_amount(wanted_reagent.type)
|
||||
if(shipped_volume > required_volume)
|
||||
shipped_volume = required_volume
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
if(!istype(other_bounty, /datum/bounty/reagent))
|
||||
return TRUE
|
||||
var/datum/bounty/reagent/R = other_bounty
|
||||
return wanted_reagent.id != R.wanted_reagent.id
|
||||
return wanted_reagent.type != R.wanted_reagent.type
|
||||
|
||||
/datum/bounty/reagent/simple_drink
|
||||
name = "Simple Drink"
|
||||
|
||||
@@ -93,9 +93,12 @@
|
||||
|
||||
/datum/supply_pack/security/armory/trackingimp
|
||||
name = "Tracking Implants Crate"
|
||||
desc = "Contains four tracking implants. Requires Armory access to open."
|
||||
cost = 1050
|
||||
contains = list(/obj/item/storage/box/trackimp)
|
||||
desc = "Contains four tracking implants and three tracking speedloaders of tracing .38 ammo. Requires Armory access to open."
|
||||
cost = 1100
|
||||
contains = list(/obj/item/storage/box/trackimp,
|
||||
/obj/item/ammo_box/c38/trac,
|
||||
/obj/item/ammo_box/c38/trac,
|
||||
/obj/item/ammo_box/c38/trac)
|
||||
crate_name = "tracking implant crate"
|
||||
|
||||
/datum/supply_pack/security/armory/fire
|
||||
@@ -172,6 +175,32 @@
|
||||
/obj/item/storage/box/beanbag)
|
||||
crate_name = "riot shotgun crate"
|
||||
|
||||
/datum/supply_pack/security/armory/russian
|
||||
name = "Russian Surplus Crate"
|
||||
desc = "Hello Comrade, we have the most modern russian military equipment the black market can offer, for the right price of course. Sadly we couldnt remove the lock so it requires Armory access to open."
|
||||
cost = 5000
|
||||
contraband = TRUE
|
||||
contains = list(/obj/item/reagent_containers/food/snacks/rationpack,
|
||||
/obj/item/ammo_box/a762,
|
||||
/obj/item/storage/toolbox/ammo,
|
||||
/obj/item/clothing/suit/armor/vest/russian,
|
||||
/obj/item/clothing/head/helmet/rus_helmet,
|
||||
/obj/item/clothing/shoes/russian,
|
||||
/obj/item/clothing/gloves/combat,
|
||||
/obj/item/clothing/under/syndicate/rus_army,
|
||||
/obj/item/clothing/under/soviet,
|
||||
/obj/item/clothing/mask/russian_balaclava,
|
||||
/obj/item/clothing/head/helmet/rus_ushanka,
|
||||
/obj/item/clothing/suit/armor/vest/russian_coat,
|
||||
/obj/item/gun/ballistic/shotgun/boltaction,
|
||||
/obj/item/gun/ballistic/shotgun/boltaction)
|
||||
crate_name = "surplus military crate"
|
||||
|
||||
/datum/supply_pack/security/armory/russian/fill(obj/structure/closet/crate/C)
|
||||
for(var/i in 1 to 10)
|
||||
var/item = pick(contains)
|
||||
new item(C)
|
||||
|
||||
/datum/supply_pack/security/armory/swat
|
||||
name = "SWAT Crate"
|
||||
desc = "Contains two fullbody sets of tough, fireproof, pressurized suits designed in a joint effort by IS-ERI and Nanotrasen. Each set contains a suit, helmet, mask, combat belt, and combat gloves. Requires Armory access to open."
|
||||
@@ -223,7 +252,7 @@
|
||||
/obj/item/ammo_box/magazine/wt550m9)
|
||||
crate_name = "auto rifle ammo crate"
|
||||
|
||||
/datum/supply_pack/security/armory/wt550ammo_nonlethal // Takes around 12 shots to stun crit someone
|
||||
/datum/supply_pack/security/armory/wt550ammo_nonlethal // Takes around 12 shots to stamcrit someone
|
||||
name = "WT-550 Semi-Auto SMG Non-Lethal Ammo Crate"
|
||||
desc = "Contains four 20-round magazines for the WT-550 Semi-Auto SMG. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open."
|
||||
cost = 1000
|
||||
|
||||
@@ -23,6 +23,21 @@
|
||||
crate_name = "Biker Kit"
|
||||
crate_type = /obj/structure/closet/crate/large
|
||||
|
||||
/datum/supply_pack/emergency/bio
|
||||
name = "Biological Emergency Crate"
|
||||
desc = "This crate holds 2 full bio suits which will protect you from viruses, along with a bio bag and two spaceacillin syringes."
|
||||
cost = 2000
|
||||
contains = list(/obj/item/clothing/head/bio_hood,
|
||||
/obj/item/clothing/head/bio_hood,
|
||||
/obj/item/clothing/suit/bio_suit,
|
||||
/obj/item/clothing/suit/bio_suit,
|
||||
/obj/item/storage/bag/bio,
|
||||
/obj/item/reagent_containers/syringe/antiviral,
|
||||
/obj/item/reagent_containers/syringe/antiviral,
|
||||
/obj/item/clothing/gloves/color/latex/nitrile,
|
||||
/obj/item/clothing/gloves/color/latex/nitrile)
|
||||
crate_name = "bio suit crate"
|
||||
|
||||
/datum/supply_pack/emergency/equipment
|
||||
name = "Emergency Bot/Internals Crate"
|
||||
desc = "Explosions got you down? These supplies are guaranteed to patch up holes, in stations and people alike! Comes with two floorbots, two medbots, five oxygen masks and five small oxygen tanks."
|
||||
@@ -112,8 +127,8 @@
|
||||
crate_type = /obj/structure/closet/crate/internals
|
||||
|
||||
/datum/supply_pack/emergency/soft_suit
|
||||
name = "Emergency Space Suit "
|
||||
desc = "Are there bombs going off left and right? Are there meteors shooting around the station? Well then! Here's two fragile space suit for emergencies. Comes with air and masks."
|
||||
name = "Emergency Space Suit"
|
||||
desc = "Are there bombs going off left and right? Are there meteors shooting around the station? Well then! Here's two fragile space suits for emergencies. Comes with air and masks."
|
||||
cost = 1200
|
||||
contains = list(/obj/item/tank/internals/air,
|
||||
/obj/item/tank/internals/air,
|
||||
@@ -126,6 +141,18 @@
|
||||
crate_name = "emergency crate"
|
||||
crate_type = /obj/structure/closet/crate/internals
|
||||
|
||||
/datum/supply_pack/emergency/bomb
|
||||
name = "Explosive Emergency Crate"
|
||||
desc = "Science gone bonkers? Beeping behind the airlock? Buy now and be the hero the station des... I mean needs! (Time not included.)"
|
||||
cost = 1500
|
||||
contains = list(/obj/item/clothing/head/bomb_hood,
|
||||
/obj/item/clothing/suit/bomb_suit,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/screwdriver,
|
||||
/obj/item/wirecutters,
|
||||
/obj/item/multitool)
|
||||
crate_name = "bomb suit crate"
|
||||
|
||||
/datum/supply_pack/emergency/firefighting
|
||||
name = "Firefighting Crate"
|
||||
desc = "Only you can prevent station fires. Partner up with two firefighter suits, gas masks, flashlights, large oxygen tanks, extinguishers, and hardhats!"
|
||||
@@ -307,4 +334,3 @@
|
||||
/obj/item/reagent_containers/spray/plantbgone)
|
||||
crate_name = "weed control crate"
|
||||
crate_type = /obj/structure/closet/crate/secure/hydroponics
|
||||
|
||||
|
||||
@@ -25,6 +25,20 @@
|
||||
new /obj/item/reagent_containers/food/snacks/grown/wheat(.)
|
||||
|
||||
|
||||
/datum/supply_pack/critter/parrot
|
||||
name = "Bird Crate"
|
||||
desc = "Contains five expert telecommunication birds."
|
||||
cost = 4000
|
||||
contains = list(/mob/living/simple_animal/parrot)
|
||||
crate_name = "parrot crate"
|
||||
|
||||
/datum/supply_pack/critter/parrot/generate()
|
||||
. = ..()
|
||||
for(var/i in 1 to 4)
|
||||
new /mob/living/simple_animal/parrot(.)
|
||||
if(prob(1))
|
||||
new /mob/living/simple_animal/parrot/clock_hawk(.)
|
||||
|
||||
/datum/supply_pack/critter/butterfly
|
||||
name = "Butterflies Crate"
|
||||
desc = "Not a very dangerous insect, but they do give off a better image than, say, flies or cockroaches."//is that a motherfucking worm reference
|
||||
|
||||
@@ -57,6 +57,27 @@
|
||||
crate_name = "blood freezer"
|
||||
crate_type = /obj/structure/closet/crate/freezer
|
||||
|
||||
/datum/supply_pack/medical/chemical
|
||||
name = "Chemical Starter Kit Crate"
|
||||
desc = "Contains twelve different chemicals, for all the fun experiments you can make."
|
||||
cost = 1700
|
||||
contains = list(/obj/item/reagent_containers/glass/bottle/hydrogen,
|
||||
/obj/item/reagent_containers/glass/bottle/carbon,
|
||||
/obj/item/reagent_containers/glass/bottle/nitrogen,
|
||||
/obj/item/reagent_containers/glass/bottle/oxygen,
|
||||
/obj/item/reagent_containers/glass/bottle/fluorine,
|
||||
/obj/item/reagent_containers/glass/bottle/phosphorus,
|
||||
/obj/item/reagent_containers/glass/bottle/silicon,
|
||||
/obj/item/reagent_containers/glass/bottle/chlorine,
|
||||
/obj/item/reagent_containers/glass/bottle/radium,
|
||||
/obj/item/reagent_containers/glass/bottle/sacid,
|
||||
/obj/item/reagent_containers/glass/bottle/ethanol,
|
||||
/obj/item/reagent_containers/glass/bottle/potassium,
|
||||
/obj/item/clothing/glasses/science,
|
||||
/obj/item/reagent_containers/dropper,
|
||||
/obj/item/storage/box/beakers)
|
||||
crate_name = "chemical crate"
|
||||
|
||||
/datum/supply_pack/medical/defibs
|
||||
name = "Defibrillator Crate"
|
||||
desc = "Contains two defibrillators for bringing the recently deceased back to life."
|
||||
@@ -229,7 +250,7 @@
|
||||
|
||||
/datum/supply_pack/medical/anitvirus
|
||||
name = "Virus Containment Crate"
|
||||
desc = "Viro let out a death plague Mk II again? Someone didnt wash their hands? Old plagues born anew? Well this crate is for you! Hope you cure it before it breaks out of the station... This crate needs medical access to open and has two bio suits, a box of needles and beakers, five spaceacillin needles, and a medibot."
|
||||
desc = "Viro let out a death plague Mk II again? Someone didn't wash their hands? Old plagues born anew? Well, this crate is for you! Hope you cure it before it breaks out of the station... This crate needs medical access to open and has two bio suits, a box of needles and beakers, five spaceacillin needles, and a medibot."
|
||||
cost = 3000
|
||||
access = ACCESS_MEDICAL
|
||||
contains = list(/mob/living/simple_animal/bot/medbot,
|
||||
@@ -245,4 +266,4 @@
|
||||
/obj/item/storage/box/syringes,
|
||||
/obj/item/storage/box/beakers)
|
||||
crate_name = "virus containment unit crate"
|
||||
crate_type = /obj/structure/closet/crate/secure/plasma
|
||||
crate_type = /obj/structure/closet/crate/secure/plasma
|
||||
|
||||
@@ -13,17 +13,16 @@
|
||||
//////////////////// Paperwork and Writing Supplies //////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/* I did it Kevin
|
||||
/datum/supply_pack/misc/abandonedcrate
|
||||
name = "Abandoned Crate"
|
||||
desc = "Someone keeps finding these locked crates out in the boonies. How about you take a crack at it, we've had our fill. WARNING: EXPLOSIVE"
|
||||
name = "Loot Box"
|
||||
desc = "Try your luck with these highly secure loot boxes! Solve the lock, win great prizes! WARNING: EXPLOSIVE FAILURE."
|
||||
contraband = TRUE
|
||||
cost = 12800
|
||||
cost = 15000
|
||||
contains = list(/obj/structure/closet/crate/secure/loot)
|
||||
crate_name = "abandoned crate"
|
||||
crate_type = /obj/structure/closet/crate/large
|
||||
dangerous = TRUE
|
||||
*/
|
||||
|
||||
/datum/supply_pack/misc/artsupply
|
||||
name = "Art Supplies"
|
||||
desc = "Make some happy little accidents with six canvasses, two easels, two boxes of crayons, and a rainbow crayon!"
|
||||
@@ -282,8 +281,7 @@
|
||||
/obj/item/storage/book/bible/booze,
|
||||
/obj/item/storage/book/bible/booze,
|
||||
/obj/item/clothing/suit/hooded/chaplain_hoodie,
|
||||
/obj/item/clothing/suit/hooded/chaplain_hoodie
|
||||
)
|
||||
/obj/item/clothing/suit/hooded/chaplain_hoodie)
|
||||
crate_name = "religious supplies crate"
|
||||
|
||||
/datum/supply_pack/misc/funeral
|
||||
|
||||
@@ -47,6 +47,26 @@
|
||||
/obj/item/storage/fancy/donut_box)
|
||||
crate_name = "candy crate"
|
||||
|
||||
/datum/supply_pack/organic/randomized/chef
|
||||
name = "Excellent Meat Crate"
|
||||
desc = "The best cuts in the whole galaxy."
|
||||
cost = 2000
|
||||
contains = list(/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/killertomato,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/bear,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/xeno,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/spider,
|
||||
/obj/item/reagent_containers/food/snacks/meat/rawbacon,
|
||||
/obj/item/reagent_containers/food/snacks/spiderleg,
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/human)
|
||||
crate_name = "food crate"
|
||||
|
||||
/datum/supply_pack/organic/randomized/chef/fill(obj/structure/closet/crate/C)
|
||||
for(var/i in 1 to 15)
|
||||
var/item = pick(contains)
|
||||
new item(C)
|
||||
|
||||
/datum/supply_pack/organic/exoticseeds
|
||||
name = "Exotic Seeds Crate"
|
||||
desc = "Any entrepreneuring botanist's dream. Contains twelve different seeds, including three replica-pod seeds and two mystery seeds!"
|
||||
@@ -92,6 +112,26 @@
|
||||
/obj/item/reagent_containers/food/snacks/grown/banana)
|
||||
crate_name = "food crate"
|
||||
|
||||
/datum/supply_pack/organic/randomized/chef/fruits
|
||||
name = "Fruit Crate"
|
||||
desc = "Rich in vitamins, may contain oranges."
|
||||
cost = 1500
|
||||
contains = list(/obj/item/reagent_containers/food/snacks/grown/citrus/lime,
|
||||
/obj/item/reagent_containers/food/snacks/grown/citrus/orange,
|
||||
/obj/item/reagent_containers/food/snacks/grown/banana,
|
||||
/obj/item/reagent_containers/food/snacks/grown/watermelon,
|
||||
/obj/item/reagent_containers/food/snacks/grown/apple,
|
||||
/obj/item/reagent_containers/food/snacks/grown/berries,
|
||||
/obj/item/reagent_containers/food/snacks/grown/citrus/lemon,
|
||||
/obj/item/reagent_containers/food/snacks/grown/pineapple,
|
||||
/obj/item/reagent_containers/food/snacks/grown/cherries,
|
||||
/obj/item/reagent_containers/food/snacks/grown/grapes,
|
||||
/obj/item/reagent_containers/food/snacks/grown/grapes/green,
|
||||
/obj/item/reagent_containers/food/snacks/grown/eggplant,
|
||||
/obj/item/reagent_containers/food/snacks/grown/peach,
|
||||
/obj/item/reagent_containers/food/snacks/grown/strawberry)
|
||||
crate_name = "food crate"
|
||||
|
||||
/datum/supply_pack/organic/fiestatortilla
|
||||
name = "Fiesta Crate"
|
||||
desc = "Spice up the kitchen with this fiesta themed food order! Contains 8 tortilla based food items, as well as a sombrero, moustache, and cloak!"
|
||||
@@ -111,71 +151,6 @@
|
||||
/obj/item/reagent_containers/glass/bottle/capsaicin)
|
||||
crate_name = "fiesta crate"
|
||||
|
||||
/datum/supply_pack/organic/fruit_1
|
||||
name = "Fruit Basic Crate"
|
||||
desc = "Getting scurvy on the station? Well heres your fixing! Contains three of each - bananas, watermelons, limes, lemons, oranges and even three pineapple."
|
||||
cost = 2250
|
||||
contains = list(/obj/item/reagent_containers/food/snacks/grown/watermelon,
|
||||
/obj/item/reagent_containers/food/snacks/grown/watermelon,
|
||||
/obj/item/reagent_containers/food/snacks/grown/watermelon,
|
||||
/obj/item/reagent_containers/food/snacks/grown/pineapple,
|
||||
/obj/item/reagent_containers/food/snacks/grown/pineapple,
|
||||
/obj/item/reagent_containers/food/snacks/grown/pineapple,
|
||||
/obj/item/reagent_containers/food/snacks/grown/citrus/lime,
|
||||
/obj/item/reagent_containers/food/snacks/grown/citrus/lime,
|
||||
/obj/item/reagent_containers/food/snacks/grown/citrus/lime,
|
||||
/obj/item/reagent_containers/food/snacks/grown/citrus/orange,
|
||||
/obj/item/reagent_containers/food/snacks/grown/citrus/orange,
|
||||
/obj/item/reagent_containers/food/snacks/grown/citrus/orange,
|
||||
/obj/item/reagent_containers/food/snacks/grown/citrus/lemon,
|
||||
/obj/item/reagent_containers/food/snacks/grown/citrus/lemon,
|
||||
/obj/item/reagent_containers/food/snacks/grown/citrus/lemon,
|
||||
/obj/item/reagent_containers/food/snacks/grown/banana,
|
||||
/obj/item/reagent_containers/food/snacks/grown/banana,
|
||||
/obj/item/reagent_containers/food/snacks/grown/banana)
|
||||
crate_name = "fruit crate"
|
||||
|
||||
/datum/supply_pack/organic/fruit_2
|
||||
name = "Fruit Delux Crate"
|
||||
desc = "Getting tired of the basic fruits and want to have something a bit more decadent! This crate is for you! Contains three of each - bunches of berries, apples, pineapples, cherries, green & red grapes, eggplants, bananas, peaches, and lastly seven strawberry. Includes one serving tray."
|
||||
cost = 3500
|
||||
contains = list(/obj/item/reagent_containers/food/snacks/grown/berries,
|
||||
/obj/item/reagent_containers/food/snacks/grown/berries,
|
||||
/obj/item/reagent_containers/food/snacks/grown/berries,
|
||||
/obj/item/reagent_containers/food/snacks/grown/apple,
|
||||
/obj/item/reagent_containers/food/snacks/grown/apple,
|
||||
/obj/item/reagent_containers/food/snacks/grown/apple,
|
||||
/obj/item/reagent_containers/food/snacks/grown/pineapple,
|
||||
/obj/item/reagent_containers/food/snacks/grown/pineapple,
|
||||
/obj/item/reagent_containers/food/snacks/grown/pineapple,
|
||||
/obj/item/reagent_containers/food/snacks/grown/cherries,
|
||||
/obj/item/reagent_containers/food/snacks/grown/cherries,
|
||||
/obj/item/reagent_containers/food/snacks/grown/cherries,
|
||||
/obj/item/reagent_containers/food/snacks/grown/grapes,
|
||||
/obj/item/reagent_containers/food/snacks/grown/grapes,
|
||||
/obj/item/reagent_containers/food/snacks/grown/grapes,
|
||||
/obj/item/reagent_containers/food/snacks/grown/grapes/green,
|
||||
/obj/item/reagent_containers/food/snacks/grown/grapes/green,
|
||||
/obj/item/reagent_containers/food/snacks/grown/grapes/green,
|
||||
/obj/item/reagent_containers/food/snacks/grown/banana,
|
||||
/obj/item/reagent_containers/food/snacks/grown/banana,
|
||||
/obj/item/reagent_containers/food/snacks/grown/banana,
|
||||
/obj/item/reagent_containers/food/snacks/grown/eggplant,
|
||||
/obj/item/reagent_containers/food/snacks/grown/eggplant,
|
||||
/obj/item/reagent_containers/food/snacks/grown/eggplant,
|
||||
/obj/item/reagent_containers/food/snacks/grown/peach,
|
||||
/obj/item/reagent_containers/food/snacks/grown/peach,
|
||||
/obj/item/reagent_containers/food/snacks/grown/peach,
|
||||
/obj/item/reagent_containers/food/snacks/grown/strawberry,
|
||||
/obj/item/reagent_containers/food/snacks/grown/strawberry,
|
||||
/obj/item/reagent_containers/food/snacks/grown/strawberry,
|
||||
/obj/item/reagent_containers/food/snacks/grown/strawberry,
|
||||
/obj/item/reagent_containers/food/snacks/grown/strawberry,
|
||||
/obj/item/reagent_containers/food/snacks/grown/strawberry,
|
||||
/obj/item/reagent_containers/food/snacks/grown/strawberry,
|
||||
/obj/item/storage/bag/tray)
|
||||
crate_name = "fruit crate"
|
||||
|
||||
/datum/supply_pack/organic/grill
|
||||
name = "Grilling Starter Kit"
|
||||
desc = "Hey dad I'm Hungry. Hi Hungry I'm THE NEW GRILLING STARTER KIT ONLY 5000 BUX GET NOW! Contains a cooking grill and five fuel coal sheets."
|
||||
@@ -283,6 +258,19 @@
|
||||
considered <b>\[REDACTED\]</b> and returned at your leisure. Note that objects the anomaly produces are specifically attuned exactly to the individual opening the anomaly; regardless \
|
||||
of species, the individual will find the object edible and it will taste great according to their personal definitions, which vary significantly based on person and species.")
|
||||
|
||||
/datum/supply_pack/organic/randomized/chef/vegetables
|
||||
name = "Vegetables Crate"
|
||||
desc = "Grown in vats."
|
||||
cost = 1300
|
||||
contains = list(/obj/item/reagent_containers/food/snacks/grown/chili,
|
||||
/obj/item/reagent_containers/food/snacks/grown/corn,
|
||||
/obj/item/reagent_containers/food/snacks/grown/tomato,
|
||||
/obj/item/reagent_containers/food/snacks/grown/potato,
|
||||
/obj/item/reagent_containers/food/snacks/grown/carrot,
|
||||
/obj/item/reagent_containers/food/snacks/grown/mushroom/chanterelle,
|
||||
/obj/item/reagent_containers/food/snacks/grown/onion,
|
||||
/obj/item/reagent_containers/food/snacks/grown/pumpkin)
|
||||
crate_name = "food crate"
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////// Hydroponics /////////////////////////////////////
|
||||
@@ -372,6 +360,8 @@
|
||||
/obj/item/hatchet,
|
||||
/obj/item/cultivator,
|
||||
/obj/item/plant_analyzer,
|
||||
/obj/item/clothing/gloves/botanic_leather,
|
||||
/obj/item/clothing/suit/apron,
|
||||
/obj/item/flashlight,
|
||||
/obj/item/seeds/carrot,
|
||||
/obj/item/seeds/carrot,
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
/datum/supply_pack/science/robotics/mecha_odysseus
|
||||
name = "Circuit Crate (Odysseus)"
|
||||
desc = "Ever wanted to build your own giant medical robot? Well, now you can! Contains the Odysseus main control board and Odysseus peripherals board. Requires Robotics access to open."
|
||||
cost = 2500
|
||||
cost = 1500
|
||||
access = ACCESS_ROBOTICS
|
||||
contains = list(/obj/item/circuitboard/mecha/odysseus/peripherals,
|
||||
/obj/item/circuitboard/mecha/odysseus/main)
|
||||
@@ -64,7 +64,7 @@
|
||||
/datum/supply_pack/science/robotics/mecha_ripley
|
||||
name = "Circuit Crate (Ripley APLU)"
|
||||
desc = "Rip apart rocks and xenomorphs alike with the Ripley APLU. Contains the Main Ripley control board, as well as the Ripley Peripherals board. Requires Robotics access to open."
|
||||
cost = 3000
|
||||
cost = 1200
|
||||
access = ACCESS_ROBOTICS
|
||||
contains = list(/obj/item/book/manual/ripley_build_and_repair,
|
||||
/obj/item/circuitboard/mecha/ripley/main,
|
||||
@@ -153,6 +153,13 @@
|
||||
crate_name = "robotics assembly crate"
|
||||
crate_type = /obj/structure/closet/crate/secure/science
|
||||
|
||||
/datum/supply_pack/science/rped
|
||||
name = "RPED crate"
|
||||
desc = "Need to rebuild the ORM but science got annihilated after a bomb test? Buy this for the most advanced parts NT can give you."
|
||||
cost = 1500
|
||||
contains = list(/obj/item/storage/part_replacer/cargo)
|
||||
crate_name = "\improper RPED crate"
|
||||
|
||||
/datum/supply_pack/science/shieldwalls
|
||||
name = "Shield Generator Crate"
|
||||
desc = "These high powered Shield Wall Generators are guaranteed to keep any unwanted lifeforms on the outside, where they belong! Contains four shield wall generators. Requires Teleporter access to open."
|
||||
@@ -188,7 +195,7 @@
|
||||
/datum/supply_pack/science/tablets
|
||||
name = "Tablet Crate"
|
||||
desc = "What's a computer? Contains five cargo tablets."
|
||||
cost = 3000
|
||||
cost = 1500
|
||||
contains = list(/obj/item/modular_computer/tablet/preset/cargo,
|
||||
/obj/item/modular_computer/tablet/preset/cargo,
|
||||
/obj/item/modular_computer/tablet/preset/cargo,
|
||||
|
||||
@@ -11,6 +11,23 @@
|
||||
access = ACCESS_SECURITY
|
||||
crate_type = /obj/structure/closet/crate/secure/gear
|
||||
|
||||
/datum/supply_pack/security/ammo
|
||||
name = "Ammo Crate - General Purpose"
|
||||
desc = "Contains two 20-round magazines for the WT-550 Auto Rifle, three boxes of buckshot ammo, three boxes of rubber ammo and special .38 speedloarders. Requires Security access to open."
|
||||
cost = 2500
|
||||
contains = list(/obj/item/ammo_box/magazine/wt550m9,
|
||||
/obj/item/ammo_box/magazine/wt550m9,
|
||||
/obj/item/storage/box/lethalshot,
|
||||
/obj/item/storage/box/lethalshot,
|
||||
/obj/item/storage/box/lethalshot,
|
||||
/obj/item/storage/box/rubbershot,
|
||||
/obj/item/storage/box/rubbershot,
|
||||
/obj/item/storage/box/rubbershot,
|
||||
/obj/item/ammo_box/c38/trac,
|
||||
/obj/item/ammo_box/c38/hotshot,
|
||||
/obj/item/ammo_box/c38/iceblox)
|
||||
crate_name = "ammo crate"
|
||||
|
||||
/datum/supply_pack/security/armor
|
||||
name = "Armor Crate"
|
||||
desc = "Three vests of well-rounded, decently-protective armor. Requires Security access to open."
|
||||
@@ -146,6 +163,13 @@
|
||||
/obj/item/storage/box/handcuffs)
|
||||
crate_name = "security supply crate"
|
||||
|
||||
/datum/supply_pack/security/vending/security
|
||||
name = "SecTech Supply Crate"
|
||||
desc = "Officer Paul bought all the donuts? Then refill the security vendor with ths crate."
|
||||
cost = 1500
|
||||
contains = list(/obj/machinery/vending/security)
|
||||
crate_name = "SecTech supply crate"
|
||||
|
||||
/datum/supply_pack/security/firingpins
|
||||
name = "Standard Firing Pins Crate"
|
||||
desc = "Upgrade your arsenal with 10 standard firing pins. Requires Security access to open."
|
||||
|
||||
@@ -103,7 +103,7 @@
|
||||
|
||||
/datum/supply_pack/service/cutlery
|
||||
name = "Kitchen Cutlery Deluxe Set"
|
||||
desc = "Need to slice and dice away those ''Tomatoes''? Well we got what you need! From a nice set of knifes, forks, plates, glasses, and a whetstone for when you got some grizzle that is a bit harder to slice then normal."
|
||||
desc = "Need to slice and dice away those \"Tomatoes\"? Well we got what you need! From a nice set of knifes, forks, plates, glasses, and a whetstone for when you got some grizzle that is a bit harder to slice then normal."
|
||||
cost = 10000
|
||||
contraband = TRUE
|
||||
contains = list(/obj/item/sharpener, //Deluxe for a reason
|
||||
@@ -127,6 +127,16 @@
|
||||
/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass)
|
||||
crate_name = "kitchen cutlery deluxe set"
|
||||
|
||||
/datum/supply_pack/service/replacementdb
|
||||
name = "Replacement Defensive Bar Shotgun"
|
||||
desc = "Someone stole the Bartender's twin-barreled possession? Give them another one at a significant markup. Comes with one unused double-barrel shotgun, shells not included. Requires bartender access to open."
|
||||
cost = 2200
|
||||
access = ACCESS_BAR
|
||||
contraband = TRUE
|
||||
contains = list(/obj/item/gun/ballistic/revolver/doublebarrel)
|
||||
crate_name = "replacement double-barrel crate"
|
||||
crate_type = /obj/structure/closet/crate/secure
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////// Janitor //////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -79,4 +79,4 @@
|
||||
var/client_keysend_amount = 0
|
||||
var/next_keysend_reset = 0
|
||||
var/next_keysend_trip_reset = 0
|
||||
var/keysend_tripped = FALSE
|
||||
var/keysend_tripped = FALSE
|
||||
|
||||
@@ -21,6 +21,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/last_ip
|
||||
var/last_id
|
||||
|
||||
var/icon/custom_holoform_icon
|
||||
var/list/cached_holoform_icons
|
||||
var/last_custom_holoform = 0
|
||||
|
||||
//Cooldowns for saving/loading. These are four are all separate due to loading code calling these one after another
|
||||
var/saveprefcooldown
|
||||
var/loadprefcooldown
|
||||
@@ -195,6 +199,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/auto_fit_viewport = TRUE
|
||||
|
||||
var/uplink_spawn_loc = UPLINK_PDA
|
||||
|
||||
var/sprint_spacebar = FALSE
|
||||
var/sprint_toggle = FALSE
|
||||
|
||||
var/list/exp = list()
|
||||
var/list/menuoptions
|
||||
@@ -245,6 +252,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=2' [current_tab == 2 ? "class='linkOn'" : ""]>Character Appearance</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=3' [current_tab == 3 ? "class='linkOn'" : ""]>Loadout</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=1' [current_tab == 1 ? "class='linkOn'" : ""]>Game Preferences</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=4' [current_tab == 4 ? "class='linkOn'" : ""]>Content Preferences</a>"
|
||||
|
||||
if(!path)
|
||||
dat += "<div class='notice'>Please create an account to save your preferences</div>"
|
||||
@@ -721,13 +729,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<table><tr><td width='340px' height='300px' valign='top'>"
|
||||
dat += "<h2>Clothing & Equipment</h2>"
|
||||
dat += "<b>Underwear:</b><a style='display:block;width:100px' href ='?_src_=prefs;preference=underwear;task=input'>[underwear]</a>"
|
||||
if(UNDIE_COLORABLE(GLOB.underwear_list[underwear]))
|
||||
if(GLOB.underwear_list[underwear]?.has_color)
|
||||
dat += "<b>Underwear Color:</b> <span style='border:1px solid #161616; background-color: #[undie_color];'> </span> <a href='?_src_=prefs;preference=undie_color;task=input'>Change</a><BR>"
|
||||
dat += "<b>Undershirt:</b><a style='display:block;width:100px' href ='?_src_=prefs;preference=undershirt;task=input'>[undershirt]</a>"
|
||||
if(UNDIE_COLORABLE(GLOB.undershirt_list[undershirt]))
|
||||
if(GLOB.undershirt_list[undershirt]?.has_color)
|
||||
dat += "<b>Undershirt Color:</b> <span style='border:1px solid #161616; background-color: #[shirt_color];'> </span> <a href='?_src_=prefs;preference=shirt_color;task=input'>Change</a><BR>"
|
||||
dat += "<b>Socks:</b><a style='display:block;width:100px' href ='?_src_=prefs;preference=socks;task=input'>[socks]</a>"
|
||||
if(UNDIE_COLORABLE(GLOB.socks_list[socks]))
|
||||
if(GLOB.socks_list[socks]?.has_color)
|
||||
dat += "<b>Socks Color:</b> <span style='border:1px solid #161616; background-color: #[socks_color];'> </span> <a href='?_src_=prefs;preference=socks_color;task=input'>Change</a><BR>"
|
||||
dat += "<b>Backpack:</b><a style='display:block;width:100px' href ='?_src_=prefs;preference=bag;task=input'>[backbag]</a>"
|
||||
dat += "<b>Jumpsuit:</b><BR><a href ='?_src_=prefs;preference=suit;task=input'>[jumpsuit_style]</a><BR>"
|
||||
@@ -834,13 +842,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
|
||||
dat +="<td width='300px' height='300px' valign='top'>"
|
||||
dat += "<h2>Citadel Preferences</h2>" //Because fuck me if preferences can't be fucking modularized and expected to update in a reasonable timeframe.
|
||||
dat += "<b>Arousal:</b><a href='?_src_=prefs;preference=arousable'>[arousable == TRUE ? "Enabled" : "Disabled"]</a><BR>"
|
||||
dat += "<b>Voracious MediHound sleepers:</b> <a href='?_src_=prefs;preference=hound_sleeper'>[(cit_toggles & MEDIHOUND_SLEEPER) ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Hear Vore Sounds:</b> <a href='?_src_=prefs;preference=toggleeatingnoise'>[(cit_toggles & EATING_NOISES) ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Hear Vore Digestion Sounds:</b> <a href='?_src_=prefs;preference=toggledigestionnoise'>[(cit_toggles & DIGESTION_NOISES) ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Lewdchem:</b><a href='?_src_=prefs;preference=lewdchem'>[lewdchem == TRUE ? "Enabled" : "Disabled"]</a><BR>"
|
||||
dat += "<b>Widescreen:</b> <a href='?_src_=prefs;preference=widescreenpref'>[widescreenpref ? "Enabled ([CONFIG_GET(string/default_view)])" : "Disabled (15x15)"]</a><br>"
|
||||
dat += "<b>Auto stand:</b> <a href='?_src_=prefs;preference=autostand'>[autostand ? "Enabled" : "Disabled"]</a><br>"
|
||||
dat += "<b>Auto OOC:</b> <a href='?_src_=prefs;preference=auto_ooc'>[auto_ooc ? "Enabled" : "Disabled"]</a><br>"
|
||||
dat += "<b>Screen Shake:</b> <a href='?_src_=prefs;preference=screenshake'>[(screenshake==100) ? "Full" : ((screenshake==0) ? "None" : "[screenshake]")]</a><br>"
|
||||
if (user && user.client && !user.client.prefs.screenshake==0)
|
||||
dat += "<b>Damage Screen Shake:</b> <a href='?_src_=prefs;preference=damagescreenshake'>[(damagescreenshake==1) ? "On" : ((damagescreenshake==0) ? "Off" : "Only when down")]</a><br>"
|
||||
@@ -892,6 +896,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "</a><br>"
|
||||
dat += "<b>Ambient Occlusion:</b> <a href='?_src_=prefs;preference=ambientocclusion'>[ambientocclusion ? "Enabled" : "Disabled"]</a><br>"
|
||||
dat += "<b>Fit Viewport:</b> <a href='?_src_=prefs;preference=auto_fit_viewport'>[auto_fit_viewport ? "Auto" : "Manual"]</a><br>"
|
||||
dat += "<b>Sprint Key:</b> <a href='?_src_=prefs;preference=sprint_key'>[sprint_spacebar ? "Space" : "Shift"]</a><br>"
|
||||
dat += "<b>Toggle Sprint:</b> <a href='?_src_=prefs;preference=sprint_toggle'>[sprint_toggle ? "Enabled" : "Disabled"]</a><br>"
|
||||
|
||||
if (CONFIG_GET(flag/maprotation) && CONFIG_GET(flag/tgstyle_maprotation))
|
||||
var/p_map = preferred_map
|
||||
@@ -991,6 +997,26 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "</font>"
|
||||
dat += "</td><td><font size=2><i>[gear.description]</i></font></td></tr>"
|
||||
dat += "</table>"
|
||||
if(4) // Content preferences
|
||||
dat += "<table><tr><td width='340px' height='300px' valign='top'>"
|
||||
dat += "<h2>Fetish content prefs</h2>"
|
||||
dat += "<b>Arousal:</b><a href='?_src_=prefs;preference=arousable'>[arousable == TRUE ? "Enabled" : "Disabled"]</a><BR>"
|
||||
dat += "<b>Voracious MediHound sleepers:</b> <a href='?_src_=prefs;preference=hound_sleeper'>[(cit_toggles & MEDIHOUND_SLEEPER) ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Hear Vore Sounds:</b> <a href='?_src_=prefs;preference=toggleeatingnoise'>[(cit_toggles & EATING_NOISES) ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Hear Vore Digestion Sounds:</b> <a href='?_src_=prefs;preference=toggledigestionnoise'>[(cit_toggles & DIGESTION_NOISES) ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Forced Feminization:</b> <a href='?_src_=prefs;preference=feminization'>[(cit_toggles & FORCED_FEM) ? "Allowed" : "Disallowed"]</a><br>"
|
||||
dat += "<b>Forced Masculinization:</b> <a href='?_src_=prefs;preference=masculinization'>[(cit_toggles & FORCED_MASC) ? "Allowed" : "Disallowed"]</a><br>"
|
||||
dat += "<b>Lewd Hypno:</b> <a href='?_src_=prefs;preference=hypno'>[(cit_toggles & HYPNO) ? "Allowed" : "Disallowed"]</a><br>"
|
||||
dat += "</td>"
|
||||
dat +="<td width='300px' height='300px' valign='top'>"
|
||||
dat += "<h2>Other content prefs</h2>"
|
||||
dat += "<b>Breast Enlargement:</b> <a href='?_src_=prefs;preference=breast_enlargement'>[(cit_toggles & BREAST_ENLARGEMENT) ? "Allowed" : "Disallowed"]</a><br>"
|
||||
dat += "<b>Penis Enlargement:</b> <a href='?_src_=prefs;preference=penis_enlargement'>[(cit_toggles & PENIS_ENLARGEMENT) ? "Allowed" : "Disallowed"]</a><br>"
|
||||
dat += "<b>Hypno:</b> <a href='?_src_=prefs;preference=never_hypno'>[(cit_toggles & NEVER_HYPNO) ? "Disallowed" : "Allowed"]</a><br>"
|
||||
dat += "<b>Aphrodisiacs:</b> <a href='?_src_=prefs;preference=aphro'>[(cit_toggles & NO_APHRO) ? "Disallowed" : "Allowed"]</a><br>"
|
||||
dat += "<b>Ass Slapping:</b> <a href='?_src_=prefs;preference=ass_slap'>[(cit_toggles & NO_ASS_SLAP) ? "Disallowed" : "Allowed"]</a><br>"
|
||||
dat += "<br>"
|
||||
|
||||
|
||||
dat += "<hr><center>"
|
||||
|
||||
@@ -2036,8 +2062,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
features["genitals_use_skintone"] = !features["genitals_use_skintone"]
|
||||
if("arousable")
|
||||
arousable = !arousable
|
||||
if("lewdchem")
|
||||
lewdchem = !lewdchem
|
||||
if("has_cock")
|
||||
features["has_cock"] = !features["has_cock"]
|
||||
if(features["has_cock"] == FALSE)
|
||||
@@ -2069,6 +2093,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
user.client.change_view(CONFIG_GET(string/default_view))
|
||||
if("autostand")
|
||||
autostand = !autostand
|
||||
if("auto_ooc")
|
||||
auto_ooc = !auto_ooc
|
||||
if ("screenshake")
|
||||
var/desiredshake = input(user, "Set the amount of screenshake you want. \n(0 = disabled, 100 = full, 200 = maximum.)", "Character Preference", screenshake) as null|num
|
||||
if (!isnull(desiredshake))
|
||||
@@ -2184,6 +2210,31 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
|
||||
if("toggledigestionnoise")
|
||||
cit_toggles ^= DIGESTION_NOISES
|
||||
|
||||
if("breast_enlargement")
|
||||
cit_toggles ^= BREAST_ENLARGEMENT
|
||||
|
||||
if("penis_enlargement")
|
||||
cit_toggles ^= PENIS_ENLARGEMENT
|
||||
|
||||
if("feminization")
|
||||
cit_toggles ^= FORCED_FEM
|
||||
|
||||
if("masculinization")
|
||||
cit_toggles ^= FORCED_MASC
|
||||
|
||||
if("hypno")
|
||||
cit_toggles ^= HYPNO
|
||||
|
||||
if("never_hypno")
|
||||
cit_toggles ^= NEVER_HYPNO
|
||||
|
||||
if("aphro")
|
||||
cit_toggles ^= NO_APHRO
|
||||
|
||||
if("ass_slap")
|
||||
cit_toggles ^= NO_ASS_SLAP
|
||||
|
||||
//END CITADEL EDIT
|
||||
|
||||
if("ambientocclusion")
|
||||
@@ -2197,6 +2248,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if(auto_fit_viewport && parent)
|
||||
parent.fit_viewport()
|
||||
|
||||
if("sprint_key")
|
||||
sprint_spacebar = !sprint_spacebar
|
||||
|
||||
if("sprint_toggle")
|
||||
sprint_toggle = !sprint_toggle
|
||||
|
||||
if("save")
|
||||
save_preferences()
|
||||
save_character()
|
||||
@@ -2369,3 +2426,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
return
|
||||
else
|
||||
custom_names[name_id] = sanitized_name
|
||||
|
||||
/datum/preferences/proc/get_filtered_holoform(filter_type)
|
||||
if(!custom_holoform_icon)
|
||||
return
|
||||
LAZYINITLIST(cached_holoform_icons)
|
||||
if(!cached_holoform_icons[filter_type])
|
||||
cached_holoform_icons[filter_type] = process_holoform_icon_filter(custom_holoform_icon, filter_type)
|
||||
return cached_holoform_icons[filter_type]
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
// You do not need to raise this if you are adding new values that have sane defaults.
|
||||
// Only raise this value when changing the meaning/format/name/layout of an existing value
|
||||
// where you would want the updater procs below to run
|
||||
#define SAVEFILE_VERSION_MAX 24
|
||||
#define SAVEFILE_VERSION_MAX 25
|
||||
|
||||
/*
|
||||
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
|
||||
@@ -113,6 +113,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
var/datum/quirk/exhibitionism/E
|
||||
var/quirk_name = initial(E.name)
|
||||
all_quirks += quirk_name
|
||||
if(current_version < 25)
|
||||
var/digi
|
||||
S["feature_lizard_legs"] >> digi
|
||||
if(digi == "Digitigrade Legs")
|
||||
WRITE_FILE(S["feature_lizard_legs"], "Digitigrade")
|
||||
|
||||
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
|
||||
if(!ckey)
|
||||
@@ -167,6 +172,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["parallax"] >> parallax
|
||||
S["ambientocclusion"] >> ambientocclusion
|
||||
S["auto_fit_viewport"] >> auto_fit_viewport
|
||||
S["sprint_spacebar"] >> sprint_spacebar
|
||||
S["sprint_toggle"] >> sprint_toggle
|
||||
S["menuoptions"] >> menuoptions
|
||||
S["enable_tips"] >> enable_tips
|
||||
S["tip_delay"] >> tip_delay
|
||||
@@ -181,8 +188,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["widescreenpref"] >> widescreenpref
|
||||
S["autostand"] >> autostand
|
||||
S["cit_toggles"] >> cit_toggles
|
||||
S["lewdchem"] >> lewdchem
|
||||
S["preferred_chaos"] >> preferred_chaos
|
||||
S["auto_ooc"] >> auto_ooc
|
||||
|
||||
|
||||
//try to fix any outdated data if necessary
|
||||
@@ -204,6 +211,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
parallax = sanitize_integer(parallax, PARALLAX_INSANE, PARALLAX_DISABLE, null)
|
||||
ambientocclusion = sanitize_integer(ambientocclusion, 0, 1, initial(ambientocclusion))
|
||||
auto_fit_viewport = sanitize_integer(auto_fit_viewport, 0, 1, initial(auto_fit_viewport))
|
||||
sprint_spacebar = sanitize_integer(sprint_spacebar, 0, 1, initial(sprint_spacebar))
|
||||
sprint_toggle = sanitize_integer(sprint_toggle, 0, 1, initial(sprint_toggle))
|
||||
ghost_form = sanitize_inlist(ghost_form, GLOB.ghost_forms, initial(ghost_form))
|
||||
ghost_orbit = sanitize_inlist(ghost_orbit, GLOB.ghost_orbits, initial(ghost_orbit))
|
||||
ghost_accs = sanitize_inlist(ghost_accs, GLOB.ghost_accs_options, GHOST_ACCS_DEFAULT_OPTION)
|
||||
@@ -219,7 +228,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
widescreenpref = sanitize_integer(widescreenpref, 0, 1, initial(widescreenpref))
|
||||
autostand = sanitize_integer(autostand, 0, 1, initial(autostand))
|
||||
cit_toggles = sanitize_integer(cit_toggles, 0, 65535, initial(cit_toggles))
|
||||
|
||||
auto_ooc = sanitize_integer(auto_ooc, 0, 1, initial(auto_ooc))
|
||||
|
||||
return 1
|
||||
|
||||
@@ -264,6 +273,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
WRITE_FILE(S["parallax"], parallax)
|
||||
WRITE_FILE(S["ambientocclusion"], ambientocclusion)
|
||||
WRITE_FILE(S["auto_fit_viewport"], auto_fit_viewport)
|
||||
WRITE_FILE(S["sprint_spacebar"], sprint_spacebar)
|
||||
WRITE_FILE(S["sprint_toggle"], sprint_toggle)
|
||||
WRITE_FILE(S["menuoptions"], menuoptions)
|
||||
WRITE_FILE(S["enable_tips"], enable_tips)
|
||||
WRITE_FILE(S["tip_delay"], tip_delay)
|
||||
@@ -278,8 +289,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
WRITE_FILE(S["widescreenpref"], widescreenpref)
|
||||
WRITE_FILE(S["autostand"], autostand)
|
||||
WRITE_FILE(S["cit_toggles"], cit_toggles)
|
||||
WRITE_FILE(S["lewdchem"], lewdchem)
|
||||
WRITE_FILE(S["preferred_chaos"], preferred_chaos)
|
||||
WRITE_FILE(S["auto_ooc"], auto_ooc)
|
||||
|
||||
return 1
|
||||
|
||||
@@ -503,7 +514,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
features["frills"] = sanitize_inlist(features["frills"], GLOB.frills_list)
|
||||
features["spines"] = sanitize_inlist(features["spines"], GLOB.spines_list)
|
||||
features["body_markings"] = sanitize_inlist(features["body_markings"], GLOB.body_markings_list)
|
||||
features["feature_lizard_legs"] = sanitize_inlist(features["legs"], GLOB.legs_list)
|
||||
features["legs"] = sanitize_inlist(features["legs"], GLOB.legs_list, "Plantigrade")
|
||||
features["deco_wings"] = sanitize_inlist(features["deco_wings"], GLOB.deco_wings_list, "None")
|
||||
features["insect_fluff"] = sanitize_inlist(features["insect_fluff"], GLOB.insect_fluffs_list)
|
||||
features["insect_markings"] = sanitize_inlist(features["insect_markings"], GLOB.insect_markings_list, "None")
|
||||
@@ -517,6 +528,21 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
|
||||
all_quirks = SANITIZE_LIST(all_quirks)
|
||||
|
||||
for(var/V in all_quirks) // quirk migration
|
||||
switch(V)
|
||||
if("Acute hepatic pharmacokinesis")
|
||||
DISABLE_BITFIELD(cit_toggles, PENIS_ENLARGEMENT)
|
||||
DISABLE_BITFIELD(cit_toggles, BREAST_ENLARGEMENT)
|
||||
ENABLE_BITFIELD(cit_toggles,FORCED_FEM)
|
||||
ENABLE_BITFIELD(cit_toggles,FORCED_MASC)
|
||||
all_quirks -= V
|
||||
if("Crocin Immunity")
|
||||
ENABLE_BITFIELD(cit_toggles,NO_APHRO)
|
||||
all_quirks -= V
|
||||
if("Buns of Steel")
|
||||
ENABLE_BITFIELD(cit_toggles,NO_ASS_SLAP)
|
||||
all_quirks -= V
|
||||
|
||||
cit_character_pref_load(S)
|
||||
|
||||
return 1
|
||||
|
||||
@@ -10,9 +10,7 @@ GLOBAL_VAR_INIT(normal_looc_colour, "#6699CC")
|
||||
to_chat(usr, "<span class='danger'> Speech is currently admin-disabled.</span>")
|
||||
return
|
||||
|
||||
if(!mob) return
|
||||
if(IsGuestKey(key))
|
||||
to_chat(src, "Guests may not use OOC.")
|
||||
if(!mob)
|
||||
return
|
||||
|
||||
msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)
|
||||
|
||||
@@ -220,10 +220,14 @@
|
||||
var/obj/item/I = target
|
||||
I.item_state = initial(picked_item.item_state)
|
||||
I.item_color = initial(picked_item.item_color)
|
||||
if(istype(I, /obj/item/clothing) && istype(initial(picked_item), /obj/item/clothing))
|
||||
var/obj/item/clothing/CL = I
|
||||
var/obj/item/clothing/PCL = picked_item
|
||||
CL.flags_cover = initial(PCL.flags_cover)
|
||||
var/obj/item/clothing/CL = target
|
||||
var/obj/item/clothing/PCL = new picked_item
|
||||
if(istype(CL) && istype(PCL))
|
||||
CL.flags_cover = PCL.flags_cover
|
||||
CL.flags_inv = PCL.flags_inv
|
||||
CL.mutantrace_variation = PCL.mutantrace_variation
|
||||
CL.alternate_worn_icon = PCL.alternate_worn_icon
|
||||
qdel(PCL)
|
||||
target.icon = initial(picked_item.icon)
|
||||
|
||||
/datum/action/item_action/chameleon/change/pda/update_item(obj/item/pda/picked_item)
|
||||
@@ -634,6 +638,7 @@
|
||||
/obj/item/clothing/neck/cloak/chameleon
|
||||
name = "black tie"
|
||||
desc = "A neosilk clip-on tie."
|
||||
icon = 'icons/obj/clothing/neck.dmi'
|
||||
icon_state = "blacktie"
|
||||
item_color = "blacktie"
|
||||
resistance_flags = NONE
|
||||
|
||||
@@ -57,7 +57,6 @@
|
||||
//No idea what this is but eh -tori
|
||||
var/force_alternate_icon = FALSE
|
||||
|
||||
|
||||
/obj/item/clothing/Initialize()
|
||||
. = ..()
|
||||
if(CHECK_BITFIELD(clothing_flags, VOICEBOX_TOGGLABLE))
|
||||
@@ -82,7 +81,7 @@
|
||||
/obj/item/reagent_containers/food/snacks/clothing
|
||||
name = "oops"
|
||||
desc = "If you're reading this it means I messed up. This is related to moths eating clothes and I didn't know a better way to do it than making a new food object."
|
||||
list_reagents = list("nutriment" = 1)
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 1)
|
||||
tastes = list("dust" = 1, "lint" = 1)
|
||||
|
||||
/obj/item/clothing/attack(mob/M, mob/user, def_zone)
|
||||
@@ -298,6 +297,33 @@ BLIND // can't see anything
|
||||
user.regenerate_icons()
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/neck/AltClick(mob/user)
|
||||
. = ..()
|
||||
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
|
||||
return
|
||||
// Polychrome stuff:
|
||||
if(hasprimary | hassecondary | hastertiary)
|
||||
var/choice = input(user,"polychromic thread options", "Clothing Recolor") as null|anything in list("[hasprimary ? "Primary Color" : ""]", "[hassecondary ? "Secondary Color" : ""]", "[hastertiary ? "Tertiary Color" : ""]") //generates a list depending on the enabled overlays
|
||||
switch(choice) //Lets the list's options actually lead to something
|
||||
if("Primary Color")
|
||||
var/primary_color_input = input(usr,"","Choose Primary Color",primary_color) as color|null //color input menu, the "|null" adds a cancel button to it.
|
||||
if(primary_color_input) //Checks if the color selected is NULL, rejects it if it is NULL.
|
||||
primary_color = sanitize_hexcolor(primary_color_input, desired_format=6, include_crunch=1) //formats the selected color properly
|
||||
update_icon() //updates the item icon
|
||||
user.regenerate_icons() //updates the worn icon. Probably a bad idea, but it works.
|
||||
if("Secondary Color")
|
||||
var/secondary_color_input = input(usr,"","Choose Secondary Color",secondary_color) as color|null
|
||||
if(secondary_color_input)
|
||||
secondary_color = sanitize_hexcolor(secondary_color_input, desired_format=6, include_crunch=1)
|
||||
update_icon()
|
||||
user.regenerate_icons()
|
||||
if("Tertiary Color")
|
||||
var/tertiary_color_input = input(usr,"","Choose Tertiary Color",tertiary_color) as color|null
|
||||
if(tertiary_color_input)
|
||||
tertiary_color = sanitize_hexcolor(tertiary_color_input, desired_format=6, include_crunch=1)
|
||||
update_icon()
|
||||
user.regenerate_icons()
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/under/verb/jumpsuit_adjust()
|
||||
set name = "Adjust Jumpsuit Style"
|
||||
|
||||
@@ -54,6 +54,9 @@
|
||||
H.blur_eyes(5)
|
||||
eyes.applyOrganDamage(5)
|
||||
|
||||
/obj/item/clothing/glasses/proc/ranged_attack(mob/living/carbon/human/user,atom/A, params)
|
||||
return FALSE
|
||||
|
||||
/obj/item/clothing/glasses/meson
|
||||
name = "optical meson scanner"
|
||||
desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting conditions."
|
||||
@@ -300,7 +303,7 @@
|
||||
add_atom_colour("#[user.eye_color]", FIXED_COLOUR_PRIORITY)
|
||||
colored_before = TRUE
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/blindfold/white/worn_overlays(isinhands = FALSE, file2use)
|
||||
/obj/item/clothing/glasses/sunglasses/blindfold/white/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
|
||||
. = list()
|
||||
if(!isinhands && ishuman(loc) && !colored_before)
|
||||
var/mob/living/carbon/human/H = loc
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
/obj/item/clothing/glasses/hud/security/sunglasses/disablers
|
||||
name = "true stunglasses"
|
||||
desc = "Made for only the best of shitsec. Wear 'em like you're gonna robust all of those fuckers."
|
||||
var/beamtype = /obj/item/projectile/beam/disabler //change for adminbus
|
||||
|
||||
/obj/item/clothing/glasses/hud/security/sunglasses/disablers/ranged_attack(mob/living/carbon/human/user,atom/A, params)
|
||||
user.changeNext_move(CLICK_CD_RANGE)
|
||||
var/obj/item/projectile/beam/disabler/LE = new beamtype( loc )
|
||||
playsound(usr.loc, 'sound/weapons/taser2.ogg', 75, 1)
|
||||
LE.firer = src
|
||||
LE.def_zone = user.get_organ_target()
|
||||
LE.preparePixelProjectile(A, src, params)
|
||||
LE.fire()
|
||||
return TRUE
|
||||
//shamelessly copied
|
||||
@@ -90,7 +90,7 @@
|
||||
|
||||
for(var/i in rad_places)
|
||||
var/turf/place = i
|
||||
if(get_dist(user, place) >= range*2) //Rads are easier to see than wires under the floor
|
||||
if(get_dist(user, place) >= range*8) //Rads are easier to see than wires under the floor
|
||||
continue
|
||||
var/strength = round(rad_places[i] / 1000, 0.1)
|
||||
var/image/pic = new(loc = place)
|
||||
@@ -139,7 +139,6 @@
|
||||
item_state = "trayson-t-ray"
|
||||
desc = "Used by engineering staff to see underfloor objects such as cables and pipes."
|
||||
range = 2
|
||||
|
||||
modes = list(MODE_NONE = MODE_TRAY, MODE_TRAY = MODE_NONE)
|
||||
|
||||
/obj/item/clothing/glasses/meson/engine/tray/prescription
|
||||
@@ -152,7 +151,6 @@
|
||||
icon_state = "trayson-shuttle"
|
||||
item_state = "trayson-shuttle"
|
||||
desc = "Used to see the boundaries of shuttle regions."
|
||||
|
||||
modes = list(MODE_NONE = MODE_SHUTTLE, MODE_SHUTTLE = MODE_NONE)
|
||||
|
||||
#undef MODE_NONE
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
/obj/item/clothing/glasses/phantomthief/syndicate/proc/injectadrenaline(mob/user, combatmodestate)
|
||||
if(istype(user) && combatmodestate && world.time >= nextadrenalinepop)
|
||||
nextadrenalinepop = world.time + 5 MINUTES
|
||||
user.reagents.add_reagent("syndicateadrenals", 5)
|
||||
user.reagents.add_reagent(/datum/reagent/syndicateadrenals, 5)
|
||||
user.playsound_local(user, 'sound/misc/adrenalinject.ogg', 100, 0, pressure_affected = FALSE)
|
||||
|
||||
/obj/item/clothing/glasses/phantomthief/syndicate/equipped(mob/user, slot)
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
user.visible_message("<span class='suicide'>\the [src] are forcing [user]'s hands around [user.p_their()] neck! It looks like the gloves are possessed!</span>")
|
||||
return OXYLOSS
|
||||
|
||||
/obj/item/clothing/gloves/worn_overlays(isinhands = FALSE)
|
||||
/obj/item/clothing/gloves/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
|
||||
. = list()
|
||||
if(!isinhands)
|
||||
if(damaged_clothes)
|
||||
|
||||
@@ -8,8 +8,6 @@
|
||||
var/blockTracking = 0 //For AI tracking
|
||||
var/can_toggle = null
|
||||
dynamic_hair_suffix = "+generic"
|
||||
var/muzzle_var = NORMAL_STYLE
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION //not all hats have muzzles
|
||||
|
||||
/obj/item/clothing/head/Initialize()
|
||||
. = ..()
|
||||
@@ -17,30 +15,6 @@
|
||||
var/mob/living/carbon/human/H = loc
|
||||
H.update_hair()
|
||||
|
||||
/obj/item/clothing/head/equipped(mob/user, slot)
|
||||
..()
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/datum/species/pref_species = H.dna.species
|
||||
|
||||
if(mutantrace_variation)
|
||||
if("mam_snouts" in pref_species.default_features)
|
||||
if(H.dna.features["mam_snouts"] != "None")
|
||||
muzzle_var = ALT_STYLE
|
||||
else
|
||||
muzzle_var = NORMAL_STYLE
|
||||
|
||||
else if("snout" in pref_species.default_features)
|
||||
if(H.dna.features["snout"] != "None")
|
||||
muzzle_var = ALT_STYLE
|
||||
else
|
||||
muzzle_var = NORMAL_STYLE
|
||||
|
||||
else
|
||||
muzzle_var = NORMAL_STYLE
|
||||
|
||||
H.update_inv_head()
|
||||
|
||||
///Special throw_impact for hats to frisbee hats at people to place them on their heads.
|
||||
/obj/item/clothing/head/throw_impact(atom/hit_atom, datum/thrownthing/thrownthing)
|
||||
. = ..()
|
||||
@@ -74,7 +48,7 @@
|
||||
|
||||
|
||||
|
||||
/obj/item/clothing/head/worn_overlays(isinhands = FALSE)
|
||||
/obj/item/clothing/head/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
|
||||
. = list()
|
||||
if(!isinhands)
|
||||
if(damaged_clothes)
|
||||
|
||||
@@ -91,7 +91,7 @@
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat
|
||||
name = "welding hard hat"
|
||||
@@ -125,7 +125,7 @@
|
||||
playsound(src, 'sound/mecha/mechmove03.ogg', 50, TRUE) //Visors don't just come from nothing
|
||||
update_icon()
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/worn_overlays(isinhands)
|
||||
/obj/item/clothing/head/hardhat/weldhat/worn_overlays(isinhands, icon_file, style_flags = NONE)
|
||||
. = ..()
|
||||
if(!isinhands)
|
||||
. += mutable_appearance('icons/mob/head.dmi', "weldhelmet")
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
dog_fashion = null
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
|
||||
/obj/item/clothing/head/helmet/attack_self(mob/user)
|
||||
if(can_toggle && !user.incapacitated())
|
||||
@@ -217,7 +217,7 @@
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
strip_delay = 80
|
||||
dog_fashion = null
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
|
||||
|
||||
/obj/item/clothing/head/helmet/knight/Initialize(mapload)
|
||||
@@ -246,7 +246,7 @@
|
||||
icon_state = "skull"
|
||||
item_state = "skull"
|
||||
strip_delay = 100
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
|
||||
//LightToggle
|
||||
|
||||
@@ -337,10 +337,28 @@
|
||||
var/datum/action/A = X
|
||||
A.UpdateButtonIcon()
|
||||
|
||||
|
||||
/obj/item/clothing/head/helmet/durathread
|
||||
name = "makeshift helmet"
|
||||
desc = "A hardhat with strips of leather and durathread for additional blunt protection."
|
||||
icon_state = "durathread"
|
||||
item_state = "durathread"
|
||||
armor = list("melee" = 25, "bullet" = 10, "laser" = 20,"energy" = 10, "bomb" = 30, "bio" = 15, "rad" = 20, "fire" = 100, "acid" = 50)
|
||||
|
||||
/obj/item/clothing/head/helmet/rus_helmet
|
||||
name = "russian helmet"
|
||||
desc = "It can hold a bottle of vodka."
|
||||
icon_state = "rus_helmet"
|
||||
item_state = "rus_helmet"
|
||||
armor = list("melee" = 30, "bullet" = 25, "laser" = 20,"energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 50)
|
||||
pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/rushelmet
|
||||
|
||||
/obj/item/clothing/head/helmet/rus_ushanka
|
||||
name = "battle ushanka"
|
||||
desc = "100% bear."
|
||||
icon_state = "rus_ushanka"
|
||||
item_state = "rus_ushanka"
|
||||
clothing_flags = THICKMATERIAL
|
||||
body_parts_covered = HEAD
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
|
||||
armor = list("melee" = 10, "bullet" = 5, "laser" = 5,"energy" = 5, "bomb" = 5, "bio" = 50, "rad" = 20, "fire" = -10, "acid" = 0)
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
item_state = "syndicate-helm-black-red"
|
||||
desc = "A plastic replica of a Syndicate agent's space helmet. You'll look just like a real murderous Syndicate agent in this! This is a toy, it is not made for use in space!"
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
|
||||
/obj/item/clothing/head/cueball
|
||||
name = "cueball helmet"
|
||||
@@ -392,3 +392,33 @@
|
||||
desc = "A green Christmas Hat! How festive!"
|
||||
icon_state = "christmashatg"
|
||||
item_state = "christmashatg"
|
||||
|
||||
/obj/item/clothing/head/cowboyhat
|
||||
name = "cowboy hat"
|
||||
desc = "A standard brown cowboy hat, yeehaw."
|
||||
icon_state = "cowboyhat"
|
||||
item_state= "cowboyhat"
|
||||
|
||||
/obj/item/clothing/head/cowboyhat/black
|
||||
name = "black cowboy hat"
|
||||
desc = "A a black cowboy hat, perfect for any outlaw"
|
||||
icon_state = "cowboyhat_black"
|
||||
item_state= "cowboyhat_black"
|
||||
|
||||
/obj/item/clothing/head/cowboyhat/white
|
||||
name = "white cowboy hat"
|
||||
desc = "A white cowboy hat, perfect for your every day rancher"
|
||||
icon_state = "cowboyhat_white"
|
||||
item_state= "cowboyhat_white"
|
||||
|
||||
/obj/item/clothing/head/cowboyhat/pink
|
||||
name = "pink cowboy hat"
|
||||
desc = "A pink cowboy? more like cowgirl hat, just don't be a buckle bunny."
|
||||
icon_state = "cowboyhat_pink"
|
||||
item_state= "cowboyhat_pink"
|
||||
|
||||
/obj/item/clothing/head/cowboyhat/sec
|
||||
name = "security cowboy hat"
|
||||
desc = "A security cowboy hat, perfect for any true lawman"
|
||||
icon_state = "cowboyhat_sec"
|
||||
item_state= "cowboyhat_sec"
|
||||
@@ -28,7 +28,7 @@
|
||||
visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||
visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
resistance_flags = FIRE_PROOF
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
|
||||
/obj/item/clothing/head/welding/attack_self(mob/user)
|
||||
weldingvisortoggle(user)
|
||||
@@ -206,7 +206,7 @@
|
||||
M.color = hair_color
|
||||
add_overlay(M)
|
||||
|
||||
/obj/item/clothing/head/wig/worn_overlays(isinhands = FALSE, file2use)
|
||||
/obj/item/clothing/head/wig/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
|
||||
. = list()
|
||||
if(!isinhands)
|
||||
var/datum/sprite_accessory/S = GLOB.hair_styles_list[hair_style]
|
||||
|
||||
@@ -8,9 +8,6 @@
|
||||
var/modifies_speech = FALSE
|
||||
var/mask_adjusted = 0
|
||||
var/adjusted_flags = null
|
||||
var/muzzle_var = NORMAL_STYLE
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION //most masks have overrides, but not all probably.
|
||||
|
||||
|
||||
/obj/item/clothing/mask/attack_self(mob/user)
|
||||
if(CHECK_BITFIELD(clothing_flags, VOICEBOX_TOGGLABLE))
|
||||
@@ -24,28 +21,6 @@
|
||||
RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech)
|
||||
else
|
||||
UnregisterSignal(M, COMSIG_MOB_SAY)
|
||||
if(!ishuman(M))
|
||||
return
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/datum/species/pref_species = H.dna.species
|
||||
|
||||
if(mutantrace_variation)
|
||||
if("mam_snouts" in pref_species.default_features)
|
||||
if(H.dna.features["mam_snouts"] != "None")
|
||||
muzzle_var = ALT_STYLE
|
||||
else
|
||||
muzzle_var = NORMAL_STYLE
|
||||
|
||||
else if("snout" in pref_species.default_features)
|
||||
if(H.dna.features["snout"] != "None")
|
||||
muzzle_var = ALT_STYLE
|
||||
else
|
||||
muzzle_var = NORMAL_STYLE
|
||||
|
||||
else
|
||||
muzzle_var = NORMAL_STYLE
|
||||
|
||||
H.update_inv_wear_mask()
|
||||
|
||||
/obj/item/clothing/mask/dropped(mob/M)
|
||||
. = ..()
|
||||
@@ -53,7 +28,7 @@
|
||||
|
||||
/obj/item/clothing/mask/proc/handle_speech()
|
||||
|
||||
/obj/item/clothing/mask/worn_overlays(isinhands = FALSE)
|
||||
/obj/item/clothing/mask/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
|
||||
. = list()
|
||||
if(!isinhands)
|
||||
if(body_parts_covered & HEAD)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
visor_flags_inv = HIDEFACE|HIDEFACIALHAIR
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
actions_types = list(/datum/action/item_action/adjust)
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
|
||||
/obj/item/clothing/mask/balaclava/attack_self(mob/user)
|
||||
adjustmask(user)
|
||||
@@ -19,7 +19,7 @@
|
||||
item_state = "luchag"
|
||||
flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
modifies_speech = TRUE
|
||||
|
||||
/obj/item/clothing/mask/luchador/handle_speech(datum/source, list/speech_args)
|
||||
@@ -57,3 +57,12 @@
|
||||
desc = "Worn by robust fighters who are willing to do anything to win."
|
||||
icon_state = "luchar"
|
||||
item_state = "luchar"
|
||||
|
||||
/obj/item/clothing/mask/russian_balaclava
|
||||
name = "russian balaclava"
|
||||
desc = "Protects your face from snow."
|
||||
icon_state = "rus_balaclava"
|
||||
item_state = "rus_balaclava"
|
||||
flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
|
||||
visor_flags_inv = HIDEFACE|HIDEFACIALHAIR
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
flags_cover = MASKCOVERSMOUTH
|
||||
visor_flags_cover = MASKCOVERSMOUTH
|
||||
resistance_flags = NONE
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
|
||||
/obj/item/clothing/mask/breath/suicide_act(mob/living/carbon/user)
|
||||
user.visible_message("<span class='suicide'>[user] is wrapping \the [src]'s tube around [user.p_their()] neck! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
permeability_coefficient = 0.01
|
||||
flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH
|
||||
resistance_flags = NONE
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
|
||||
/obj/item/clothing/mask/gas/glass
|
||||
name = "glass gas mask"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
gas_transfer_coefficient = 0.9
|
||||
equip_delay_other = 20
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
|
||||
/obj/item/clothing/mask/muzzle/attack_paw(mob/user)
|
||||
if(iscarbon(user))
|
||||
@@ -31,7 +31,7 @@
|
||||
permeability_coefficient = 0.01
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 25, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
actions_types = list(/datum/action/item_action/adjust)
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
|
||||
/obj/item/clothing/mask/surgical/attack_self(mob/user)
|
||||
adjustmask(user)
|
||||
@@ -41,7 +41,7 @@
|
||||
desc = "Warning: moustache is fake."
|
||||
icon_state = "fake-moustache"
|
||||
flags_inv = HIDEFACE
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
|
||||
/obj/item/clothing/mask/fakemoustache/italian
|
||||
name = "italian moustache"
|
||||
@@ -71,7 +71,7 @@
|
||||
name = "joy mask"
|
||||
desc = "Express your happiness or hide your sorrows with this laughing face with crying tears of joy cutout."
|
||||
icon_state = "joy"
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
|
||||
/obj/item/clothing/mask/pig
|
||||
name = "pig mask"
|
||||
@@ -242,7 +242,7 @@
|
||||
slot_flags = ITEM_SLOT_MASK
|
||||
adjusted_flags = ITEM_SLOT_HEAD
|
||||
icon_state = "bandbotany"
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
|
||||
/obj/item/clothing/mask/bandana/attack_self(mob/user)
|
||||
adjustmask(user)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
strip_delay = 40
|
||||
equip_delay_other = 40
|
||||
|
||||
/obj/item/clothing/neck/worn_overlays(isinhands = FALSE)
|
||||
/obj/item/clothing/neck/worn_overlays(isinhands = FALSE, icon_flag, style_flags = NONE)
|
||||
. = list()
|
||||
if(!isinhands)
|
||||
if(body_parts_covered & HEAD)
|
||||
@@ -192,7 +192,7 @@
|
||||
tagname = copytext(sanitize(input(user, "Would you like to change the name on the tag?", "Name your new pet", "Spot") as null|text),1,MAX_NAME_LEN)
|
||||
name = "[initial(name)] - [tagname]"
|
||||
|
||||
/obj/item/clothing/neck/petcollar/worn_overlays(isinhands, icon_file)
|
||||
/obj/item/clothing/neck/petcollar/worn_overlays(isinhands, icon_file, style_flags = NONE)
|
||||
. = ..()
|
||||
if(hasprimary | hassecondary | hastertiary)
|
||||
if(!isinhands) //prevents the worn sprites from showing up if you're just holding them
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
return
|
||||
|
||||
var/obj/item/reagent_containers/glass/bucket/bucket = H.get_item_for_held_index(1)
|
||||
bucket.reagents.add_reagent("water",70)
|
||||
bucket.reagents.add_reagent(/datum/reagent/water,70)
|
||||
|
||||
/datum/outfit/laser_tag
|
||||
name = "Laser Tag Red"
|
||||
|
||||
@@ -15,9 +15,7 @@
|
||||
var/offset = 0
|
||||
var/equipped_before_drop = FALSE
|
||||
|
||||
//CITADEL EDIT Enables digitigrade shoe styles
|
||||
var/adjusted = NORMAL_STYLE
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
mutantrace_variation = STYLE_DIGITIGRADE
|
||||
var/last_bloodtype = "" //used to track the last bloodtype to have graced these shoes; makes for better performing footprint shenanigans
|
||||
var/last_blood_DNA = "" //same as last one
|
||||
|
||||
@@ -51,7 +49,7 @@
|
||||
last_bloodtype = blood_dna[blood_dna[blood_dna.len]]//trust me this works
|
||||
last_blood_DNA = blood_dna[blood_dna.len]
|
||||
|
||||
/obj/item/clothing/shoes/worn_overlays(isinhands = FALSE)
|
||||
/obj/item/clothing/shoes/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
|
||||
. = list()
|
||||
if(!isinhands)
|
||||
var/bloody = FALSE
|
||||
@@ -63,23 +61,12 @@
|
||||
if(damaged_clothes)
|
||||
. += mutable_appearance('icons/effects/item_damage.dmi', "damagedshoe")
|
||||
if(bloody)
|
||||
if(adjusted == NORMAL_STYLE)
|
||||
. += mutable_appearance('icons/effects/blood.dmi', "shoeblood", color = blood_DNA_to_color())
|
||||
else
|
||||
. += mutable_appearance('icons/mob/feet_digi.dmi', "shoeblood", color = blood_DNA_to_color())
|
||||
var/file2use = style_flags & STYLE_DIGITIGRADE ? 'icons/mob/feet_digi.dmi' : 'icons/effects/blood.dmi'
|
||||
. += mutable_appearance(file2use, "shoeblood", color = blood_DNA_to_color())
|
||||
|
||||
/obj/item/clothing/shoes/equipped(mob/user, slot)
|
||||
. = ..()
|
||||
|
||||
if(mutantrace_variation && ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(DIGITIGRADE in H.dna.species.species_traits)
|
||||
adjusted = ALT_STYLE
|
||||
H.update_inv_shoes()
|
||||
else if(adjusted == ALT_STYLE)
|
||||
adjusted = NORMAL_STYLE
|
||||
H.update_inv_shoes()
|
||||
|
||||
if(offset && slot_flags & slotdefine2slotbit(slot))
|
||||
user.pixel_y += offset
|
||||
worn_y_dimension -= (offset * 2)
|
||||
|
||||
@@ -89,12 +89,12 @@
|
||||
|
||||
/obj/item/clothing/shoes/clown_shoes/equipped(mob/user, slot)
|
||||
. = ..()
|
||||
if(user.mind && user.mind.assigned_role == "Clown")
|
||||
if(user.mind && HAS_TRAIT(user.mind, TRAIT_CLOWN_MENTALITY))
|
||||
SEND_SIGNAL(user, COMSIG_CLEAR_MOOD_EVENT, "noshoes")
|
||||
|
||||
/obj/item/clothing/shoes/clown_shoes/dropped(mob/user)
|
||||
. = ..()
|
||||
if(user.mind && user.mind.assigned_role == "Clown")
|
||||
if(user.mind && HAS_TRAIT(user.mind, TRAIT_CLOWN_MENTALITY))
|
||||
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "noshoes", /datum/mood_event/noshoes)
|
||||
|
||||
/obj/item/clothing/shoes/clown_shoes/jester
|
||||
@@ -327,6 +327,13 @@
|
||||
lightCycle = 0
|
||||
active = FALSE
|
||||
|
||||
/obj/item/clothing/shoes/russian
|
||||
name = "russian boots"
|
||||
desc = "Comfy shoes."
|
||||
icon_state = "rus_shoes"
|
||||
item_state = "rus_shoes"
|
||||
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
|
||||
|
||||
// kevin is into feet
|
||||
/obj/item/clothing/shoes/wraps
|
||||
name = "gilded leg wraps"
|
||||
@@ -347,4 +354,14 @@
|
||||
/obj/item/clothing/shoes/wraps/blue
|
||||
name = "blue leg wraps"
|
||||
desc = "Ankle coverings. Hang ten, brother."
|
||||
icon_state = "bluecuffs"
|
||||
icon_state = "bluecuffs"
|
||||
|
||||
/obj/item/clothing/shoes/cowboyboots
|
||||
name = "cowboy boots"
|
||||
desc = "A standard pair of brown cowboy boots."
|
||||
icon_state = "cowboyboots"
|
||||
|
||||
/obj/item/clothing/shoes/cowboyboots/black
|
||||
name = "black cowboy boots"
|
||||
desc = "A pair of black cowboy boots, pretty easy to scuff up."
|
||||
icon_state = "cowboyboots_black"
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
if(!ishuman(user))
|
||||
return
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(!(HAS_TRAIT(H, TRAIT_CLUMSY)) && !(H.mind && H.mind.assigned_role == "Clown"))
|
||||
if(!(HAS_TRAIT(H, TRAIT_CLUMSY)) && !(H.mind && HAS_TRAIT(H.mind, TRAIT_CLOWN_MENTALITY)))
|
||||
return
|
||||
if(slot == SLOT_SHOES)
|
||||
spells = new
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
icon_state = "leather"
|
||||
item_color = "leather"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/shoes/magboots/deathsquad
|
||||
desc = "Very expensive and advanced magnetic boots, used only by the elite during extravehicular activity to ensure the user remains safely attached to the vehicle."
|
||||
@@ -14,7 +14,7 @@
|
||||
magboot_state = "DS-magboots"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/shoes/magboots/atmos
|
||||
desc = "Magnetic boots, often used during extravehicular activity to ensure the user remains safely attached to the vehicle. These are painted in the colors of an atmospheric technician."
|
||||
@@ -23,102 +23,102 @@
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
magboot_state = "atmosmagboots"
|
||||
resistance_flags = FIRE_PROOF
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/shoes/simonshoes
|
||||
name = "Simon's Shoes"
|
||||
desc = "Simon's Shoes."
|
||||
icon_state = "simonshoes"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/shoes/kneesocks
|
||||
name = "kneesocks"
|
||||
desc = "A pair of girly knee-high socks."
|
||||
icon_state = "kneesock"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/shoes/jestershoes
|
||||
name = "Jester Shoes"
|
||||
desc = "As worn by the clowns of old."
|
||||
icon_state = "jestershoes"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/shoes/aviatorboots
|
||||
name = "Aviator Boots"
|
||||
desc = "Boots suitable for just about any occasion."
|
||||
icon_state = "aviator_boots"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/shoes/libertyshoes
|
||||
name = "Liberty Shoes"
|
||||
desc = "Freedom isn't free, neither were these shoes."
|
||||
icon_state = "libertyshoes"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/shoes/megaboots
|
||||
name = "DRN-001 Boots"
|
||||
desc = "Large armored boots, very weak to large spikes."
|
||||
icon_state = "megaboots"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/shoes/protoboots
|
||||
name = "Prototype Boots"
|
||||
desc = "Functionally identical to the DRN-001 model's boots, but in red."
|
||||
icon_state = "protoboots"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/shoes/megaxboots
|
||||
name = "Maverick Hunter boots"
|
||||
desc = "Regardless of how much stronger these boots are than the DRN-001 model's, they're still extremely easy to pierce with a large spike."
|
||||
icon_state = "megaxboots"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/shoes/joeboots
|
||||
name = "Sniper Boots"
|
||||
desc = "Nearly identical to the Prototype's boots, except in black."
|
||||
icon_state = "joeboots"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/shoes/doomguy
|
||||
name = "Doomguy's boots"
|
||||
desc = "If you look closely, you might see skull fragments still buried in these boots."
|
||||
icon_state = "doom"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/shoes/rottenshoes
|
||||
name = "rotten shoes"
|
||||
desc = "These shoes seem perfect for sneaking around."
|
||||
icon_state = "rottenshoes"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/shoes/sandal/slippers
|
||||
name = "magic slippers"
|
||||
icon_state = "slippers"
|
||||
desc = "For the wizard that puts comfort first. Who's going to laugh?"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/shoes/slippers_worn
|
||||
name = "worn bunny slippers"
|
||||
desc = "Fluffy..."
|
||||
icon_state = "slippers_worn"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/shoes/jackboots/neorussian
|
||||
name = "neo-Russian boots"
|
||||
desc = "Tovarish, no one will realize you stepped on a pile of shit if your pair already looks like shit."
|
||||
icon_state = "nr_boots"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
@@ -21,7 +21,7 @@
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
resistance_flags = NONE
|
||||
dog_fashion = null
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
|
||||
/obj/item/clothing/suit/space
|
||||
@@ -46,4 +46,4 @@
|
||||
equip_delay_other = 80
|
||||
resistance_flags = NONE
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE //rated for cosmic radation :honk:
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC|STYLE_PAW_TAURIC
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
actions_types = list(/datum/action/item_action/toggle)
|
||||
armor = list("melee" = 60, "bullet" = 60, "laser" = 60, "energy" = 60, "bomb" = 30, "bio" = 90, "rad" = 90, "fire" = 100, "acid" = 1000)
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
mutantrace_variation = STYLE_DIGITIGRADE
|
||||
var/list/chronosafe_items = list(/obj/item/chrono_eraser, /obj/item/gun/energy/chrono_gun)
|
||||
var/obj/item/clothing/head/helmet/space/chronos/helmet = null
|
||||
var/obj/effect/chronos_cam/camera = null
|
||||
|
||||
@@ -180,7 +180,7 @@
|
||||
armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 100, "acid" = 75)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine
|
||||
resistance_flags = FIRE_PROOF
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_ALL_TAURIC
|
||||
|
||||
//Atmospherics
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/engine/atmos
|
||||
@@ -202,7 +202,6 @@
|
||||
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/atmos
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
|
||||
|
||||
//Chief Engineer's hardsuit
|
||||
@@ -226,7 +225,6 @@
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/elite
|
||||
jetpack = /obj/item/tank/jetpack/suit
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
|
||||
//Mining hardsuit
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/mining
|
||||
@@ -257,7 +255,7 @@
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage/bag/ore, /obj/item/pickaxe)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/mining
|
||||
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_ALL_TAURIC
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/mining/Initialize()
|
||||
. = ..()
|
||||
@@ -353,7 +351,7 @@
|
||||
allowed = list(/obj/item/gun, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi
|
||||
jetpack = /obj/item/tank/jetpack/suit
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_ALL_TAURIC
|
||||
|
||||
//Elite Syndie suit
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/syndi/elite
|
||||
@@ -370,7 +368,6 @@
|
||||
on = FALSE
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/syndi/elite
|
||||
name = "elite syndicate hardsuit"
|
||||
desc = "An elite version of the syndicate hardsuit, with improved armour and fireproofing. It is in travel mode."
|
||||
@@ -382,7 +379,8 @@
|
||||
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC|STYLE_PAW_TAURIC
|
||||
|
||||
|
||||
//The Owl Hardsuit
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/syndi/owl
|
||||
@@ -404,6 +402,7 @@
|
||||
item_state = "s_suit"
|
||||
item_color = "owl"
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/owl
|
||||
mutantrace_variation = STYLE_DIGITIGRADE
|
||||
|
||||
|
||||
//Wizard hardsuit
|
||||
@@ -430,6 +429,7 @@
|
||||
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/wizard
|
||||
mutantrace_variation = STYLE_DIGITIGRADE
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/wizard/Initialize()
|
||||
. = ..()
|
||||
@@ -455,7 +455,7 @@
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage/firstaid, /obj/item/healthanalyzer, /obj/item/stack/medical)
|
||||
armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/medical
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_ALL_TAURIC
|
||||
|
||||
//Research Director hardsuit
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/rd
|
||||
@@ -497,7 +497,6 @@
|
||||
/obj/item/hand_tele, /obj/item/aicard)
|
||||
armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 100, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 80)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/rd
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
|
||||
//Security hardsuit
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/security
|
||||
@@ -515,7 +514,7 @@
|
||||
item_state = "sec_hardsuit"
|
||||
armor = list("melee" = 35, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_ALL_TAURIC
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/security/Initialize()
|
||||
. = ..()
|
||||
@@ -536,7 +535,6 @@
|
||||
armor = list("melee" = 45, "bullet" = 25, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 100, "rad" = 50, "fire" = 95, "acid" = 95)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/hos
|
||||
jetpack = /obj/item/tank/jetpack/suit
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
|
||||
//Captain
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/captain
|
||||
@@ -564,7 +562,6 @@
|
||||
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT //this needed to be added a long fucking time ago
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/captain
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/captain/Initialize()
|
||||
. = ..()
|
||||
@@ -586,12 +583,12 @@
|
||||
item_state = "clown_hardsuit"
|
||||
armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 30)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/clown
|
||||
mutantrace_variation = STYLE_DIGITIGRADE
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/clown/mob_can_equip(mob/M, slot)
|
||||
if(!..() || !ishuman(M))
|
||||
return FALSE
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.mind.assigned_role == "Clown")
|
||||
if(M.mind && HAS_TRAIT(M.mind, TRAIT_CLOWN_MENTALITY))
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
@@ -615,6 +612,7 @@
|
||||
slowdown = 3
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ancient
|
||||
resistance_flags = FIRE_PROOF
|
||||
mutantrace_variation = STYLE_DIGITIGRADE
|
||||
var/footstep = 1
|
||||
var/mob/listeningTo
|
||||
|
||||
@@ -628,7 +626,9 @@
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage, /obj/item/construction/rcd, /obj/item/pipe_dispenser)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ancient/mason
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | IMMUTABLE_SLOW
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
flags_1 = TESLA_IGNORE_1
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/ancient/mason
|
||||
name = "M.A.S.O.N RIG helmet"
|
||||
@@ -638,12 +638,13 @@
|
||||
armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
|
||||
item_color = "ancient"
|
||||
brightness_on = 16
|
||||
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS | SCAN_REAGENTS
|
||||
flash_protect = 5 //We will not be flash by bombs
|
||||
tint = 1
|
||||
var/obj/machinery/doppler_array/integrated/bomb_radar
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS | SCAN_REAGENTS
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
flags_1 = TESLA_IGNORE_1
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/ancient/mason/Initialize()
|
||||
. = ..()
|
||||
@@ -710,7 +711,6 @@
|
||||
var/recharge_rate = 1 //How quickly the shield recharges once it starts charging
|
||||
var/shield_state = "shield-old"
|
||||
var/shield_on = "shield-old"
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/shielded/Initialize()
|
||||
. = ..()
|
||||
@@ -750,13 +750,11 @@
|
||||
var/mob/living/carbon/human/C = loc
|
||||
C.update_inv_wear_suit()
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/shielded/worn_overlays(isinhands)
|
||||
. = list()
|
||||
/obj/item/clothing/suit/space/hardsuit/shielded/worn_overlays(isinhands, icon_file, style_flags = NONE)
|
||||
. = ..()
|
||||
if(!isinhands)
|
||||
if(taurmode >= SNEK_TAURIC)
|
||||
. += mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', shield_state, MOB_LAYER + 0.01)
|
||||
else
|
||||
. += mutable_appearance('icons/effects/effects.dmi', shield_state, MOB_LAYER + 0.01)
|
||||
var/file2use = style_flags & STYLE_ALL_TAURIC ? 'modular_citadel/icons/mob/64x32_effects.dmi' : 'icons/effects/effects.dmi'
|
||||
. += mutable_appearance(file2use, shield_state, MOB_LAYER + 0.01)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/shielded
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
@@ -826,7 +824,7 @@
|
||||
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi
|
||||
slowdown = 0
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_ALL_TAURIC
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/shielded/syndi/Initialize()
|
||||
jetpack = new /obj/item/tank/jetpack/suit(src)
|
||||
@@ -855,7 +853,6 @@
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/swat
|
||||
dog_fashion = /datum/dog_fashion/back/deathsquad
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/shielded/swat
|
||||
name = "death commando helmet"
|
||||
@@ -886,7 +883,7 @@
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator)
|
||||
var/energy_color = "#35FFF0"
|
||||
var/obj/item/clothing/suit/space/hardsuit/lavaknight/linkedsuit = null
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/Initialize()
|
||||
. = ..()
|
||||
@@ -916,7 +913,7 @@
|
||||
|
||||
add_overlay(helm_overlay)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/worn_overlays(isinhands = FALSE, icon_file)
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
|
||||
. = ..()
|
||||
if(!isinhands)
|
||||
var/mutable_appearance/energy_overlay = mutable_appearance(icon_file, "knight_cydonia_overlay", ABOVE_LIGHTING_LAYER)
|
||||
@@ -935,8 +932,6 @@
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage/bag/ore, /obj/item/pickaxe)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/lavaknight
|
||||
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
|
||||
var/energy_color = "#35FFF0"
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/lavaknight/Initialize()
|
||||
@@ -955,7 +950,7 @@
|
||||
|
||||
add_overlay(suit_overlay)
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/lavaknight/worn_overlays(isinhands = FALSE, icon_file)
|
||||
/obj/item/clothing/suit/space/hardsuit/lavaknight/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
|
||||
. = ..()
|
||||
if(!isinhands)
|
||||
var/mutable_appearance/energy_overlay = mutable_appearance(icon_file, "knight_cydonia_overlay", ABOVE_LIGHTING_LAYER)
|
||||
|
||||
@@ -53,6 +53,7 @@ Contains:
|
||||
armor = list("melee" = 40, "bullet" = 30, "laser" = 30,"energy" = 30, "bomb" = 50, "bio" = 90, "rad" = 20, "fire" = 100, "acid" = 100)
|
||||
strip_delay = 120
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
mutantrace_variation = STYLE_DIGITIGRADE
|
||||
|
||||
/obj/item/clothing/head/helmet/space/beret
|
||||
name = "officer's beret"
|
||||
@@ -65,7 +66,7 @@ Contains:
|
||||
strip_delay = 130
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/suit/space/officer
|
||||
name = "officer's jacket"
|
||||
@@ -81,6 +82,7 @@ Contains:
|
||||
strip_delay = 130
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
mutantrace_variation = STYLE_DIGITIGRADE
|
||||
|
||||
//NASA Voidsuit
|
||||
/obj/item/clothing/head/helmet/space/nasavoid
|
||||
@@ -95,6 +97,7 @@ Contains:
|
||||
item_state = "void"
|
||||
desc = "An old, NASA CentCom branch designed, dark red space suit."
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/multitool)
|
||||
mutantrace_variation = STYLE_DIGITIGRADE
|
||||
|
||||
/obj/item/clothing/head/helmet/space/nasavoid/old
|
||||
name = "Engineering Void Helmet"
|
||||
@@ -116,7 +119,7 @@ Contains:
|
||||
desc = "Ho ho ho. Merrry X-mas!"
|
||||
icon_state = "santahat"
|
||||
flags_cover = HEADCOVERSEYES
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
dog_fashion = /datum/dog_fashion/head/santa
|
||||
|
||||
@@ -127,6 +130,7 @@ Contains:
|
||||
item_state = "santa"
|
||||
slowdown = 0
|
||||
allowed = list(/obj/item) //for stuffing exta special presents
|
||||
mutantrace_variation = STYLE_DIGITIGRADE
|
||||
|
||||
|
||||
//Space pirate outfit
|
||||
@@ -140,14 +144,14 @@ Contains:
|
||||
strip_delay = 40
|
||||
equip_delay_other = 20
|
||||
flags_cover = HEADCOVERSEYES
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/head/helmet/space/pirate/bandana
|
||||
name = "royal bandana"
|
||||
desc = "A space-proof bandanna crafted with reflective kevlar."
|
||||
icon_state = "bandana"
|
||||
item_state = "bandana"
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/suit/space/pirate
|
||||
name = "royal waistcoat "
|
||||
@@ -161,6 +165,7 @@ Contains:
|
||||
armor = list("melee" = 30, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 60, "acid" = 75)
|
||||
strip_delay = 40
|
||||
equip_delay_other = 20
|
||||
mutantrace_variation = STYLE_DIGITIGRADE
|
||||
|
||||
//Emergency Response Team suits
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/ert
|
||||
@@ -189,7 +194,6 @@ Contains:
|
||||
slowdown = 0
|
||||
strip_delay = 130
|
||||
resistance_flags = ACID_PROOF
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
|
||||
//ERT Security
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/ert/sec
|
||||
@@ -251,6 +255,7 @@ Contains:
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/alert
|
||||
armor = list("melee" = 70, "bullet" = 55, "laser" = 50, "energy" = 50, "bomb" = 65, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC
|
||||
|
||||
//ERT Security
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/ert/alert/sec
|
||||
@@ -298,7 +303,6 @@ Contains:
|
||||
item_state = "s_suit"
|
||||
desc = "A lightweight space suit with the basic ability to protect the wearer from the vacuum of space during emergencies."
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 65)
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
|
||||
/obj/item/clothing/head/helmet/space/eva
|
||||
name = "EVA helmet"
|
||||
@@ -317,7 +321,7 @@ Contains:
|
||||
strip_delay = 130
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
resistance_flags = ACID_PROOF | FIRE_PROOF
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/suit/space/freedom
|
||||
name = "eagle suit"
|
||||
@@ -330,6 +334,7 @@ Contains:
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
resistance_flags = ACID_PROOF | FIRE_PROOF
|
||||
slowdown = 0
|
||||
mutantrace_variation = STYLE_DIGITIGRADE
|
||||
|
||||
//Carpsuit, bestsuit, lovesuit
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/carp
|
||||
@@ -340,7 +345,7 @@ Contains:
|
||||
armor = list("melee" = -20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 75) //As whimpy as a space carp
|
||||
brightness_on = 0 //luminosity when on
|
||||
actions_types = list()
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/carp/Initialize()
|
||||
. = ..()
|
||||
@@ -356,6 +361,7 @@ Contains:
|
||||
armor = list("melee" = -20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 75) //As whimpy whimpy whoo
|
||||
allowed = list(/obj/item/tank/internals, /obj/item/gun/ballistic/automatic/speargun) //I'm giving you a hint here
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/carp
|
||||
mutantrace_variation = STYLE_DIGITIGRADE
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal
|
||||
name = "paranormal response unit helmet"
|
||||
@@ -366,7 +372,7 @@ Contains:
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
actions_types = list()
|
||||
resistance_flags = FIRE_PROOF
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/ert/paranormal/Initialize()
|
||||
. = ..()
|
||||
@@ -380,7 +386,6 @@ Contains:
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
resistance_flags = FIRE_PROOF
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/ert/paranormal/Initialize()
|
||||
. = ..()
|
||||
@@ -427,7 +432,6 @@ Contains:
|
||||
slowdown = 2
|
||||
armor = list("melee" = 5, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 0, "acid" = 0)
|
||||
strip_delay = 65
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
|
||||
/obj/item/clothing/suit/space/fragile/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
if(!torn && prob(50))
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
var/next_extinguish = 0
|
||||
var/extinguish_cooldown = 100
|
||||
var/extinguishes_left = 10
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/suit/space/eva/plasmaman/examine(mob/user)
|
||||
. = ..()
|
||||
@@ -47,7 +46,7 @@
|
||||
var/on = FALSE
|
||||
var/light_overlay = "envirohelm-light"
|
||||
actions_types = list(/datum/action/item_action/toggle_helmet_light)
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/head/helmet/space/plasmaman/attack_self(mob/user)
|
||||
if(!light_overlay)
|
||||
@@ -68,7 +67,7 @@
|
||||
var/datum/action/A=X
|
||||
A.UpdateButtonIcon()
|
||||
|
||||
/obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(isinhands, icon_file)
|
||||
/obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(isinhands, icon_file, style_flags = NONE)
|
||||
. = ..()
|
||||
if(!isinhands && on)
|
||||
. += mutable_appearance(icon_file, light_overlay)
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
|
||||
armor = list("melee" = 40, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 80, "acid" = 85)
|
||||
|
||||
mutantrace_variation = STYLE_DIGITIGRADE
|
||||
|
||||
//Green syndicate space suit
|
||||
/obj/item/clothing/head/helmet/space/syndicate/green
|
||||
@@ -50,6 +50,7 @@
|
||||
name = "orange space suit"
|
||||
icon_state = "syndicate-orange"
|
||||
item_state = "syndicate-orange"
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC|STYLE_PAW_TAURIC
|
||||
|
||||
//Blue syndicate space suit
|
||||
/obj/item/clothing/head/helmet/space/syndicate/blue
|
||||
@@ -109,7 +110,6 @@
|
||||
name = "green space suit"
|
||||
icon_state = "syndicate-black-med"
|
||||
item_state = "syndicate-black"
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
|
||||
|
||||
//Black-orange syndicate space suit
|
||||
@@ -134,6 +134,7 @@
|
||||
name = "black and red space suit"
|
||||
icon_state = "syndicate-black-red"
|
||||
item_state = "syndicate-black-red"
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC|STYLE_PAW_TAURIC
|
||||
|
||||
|
||||
//Black with yellow/red engineering syndicate space suit
|
||||
|
||||
@@ -9,56 +9,16 @@
|
||||
var/blood_overlay_type = "suit"
|
||||
var/togglename = null
|
||||
var/suittoggled = FALSE
|
||||
mutantrace_variation = STYLE_DIGITIGRADE
|
||||
|
||||
var/adjusted = NORMAL_STYLE
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
var/tauric = FALSE //Citadel Add for tauric hardsuits
|
||||
var/taurmode = NOT_TAURIC
|
||||
var/dimension_x = 32
|
||||
var/dimension_y = 32
|
||||
var/center = FALSE //Should we center the sprite?
|
||||
|
||||
/obj/item/clothing/suit/equipped(mob/user, slot)
|
||||
..()
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
|
||||
if(mutantrace_variation)
|
||||
if(DIGITIGRADE in H.dna.species.species_traits)
|
||||
adjusted = ALT_STYLE
|
||||
H.update_inv_wear_suit()
|
||||
else if(adjusted == ALT_STYLE)
|
||||
adjusted = NORMAL_STYLE
|
||||
|
||||
if(("taur" in H.dna.species.mutant_bodyparts) && (H.dna.features["taur"] != "None"))
|
||||
if(H.dna.features["taur"] in GLOB.noodle_taurs)
|
||||
taurmode = SNEK_TAURIC
|
||||
if(tauric == TRUE)
|
||||
center = TRUE
|
||||
dimension_x = 64
|
||||
else if(H.dna.features["taur"] in GLOB.paw_taurs)
|
||||
taurmode = PAW_TAURIC
|
||||
if(tauric == TRUE)
|
||||
center = TRUE
|
||||
dimension_x = 64
|
||||
else
|
||||
taurmode = NOT_TAURIC
|
||||
if(tauric == TRUE)
|
||||
center = FALSE
|
||||
dimension_x = 32
|
||||
H.update_inv_wear_suit()
|
||||
|
||||
|
||||
/obj/item/clothing/suit/worn_overlays(isinhands = FALSE)
|
||||
. = list()
|
||||
/obj/item/clothing/suit/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
|
||||
. = ..()
|
||||
if(!isinhands)
|
||||
if(damaged_clothes)
|
||||
. += mutable_appearance('icons/effects/item_damage.dmi', "damaged[blood_overlay_type]")
|
||||
if(blood_DNA)
|
||||
if(tauric && taurmode >= SNEK_TAURIC)
|
||||
. += mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', "[blood_overlay_type]blood", color = blood_DNA_to_color())
|
||||
else
|
||||
. += mutable_appearance('icons/effects/blood.dmi', "[blood_overlay_type]blood", color = blood_DNA_to_color())
|
||||
var/file2use = (style_flags & STYLE_ALL_TAURIC) ? 'modular_citadel/icons/mob/64x32_effects.dmi' : 'icons/effects/blood.dmi'
|
||||
. += mutable_appearance(file2use, "[blood_overlay_type]blood", color = blood_DNA_to_color())
|
||||
var/mob/living/carbon/human/M = loc
|
||||
if(ishuman(M) && M.w_uniform)
|
||||
var/obj/item/clothing/under/U = M.w_uniform
|
||||
|
||||
@@ -248,3 +248,20 @@
|
||||
max_integrity = 200
|
||||
resistance_flags = FLAMMABLE
|
||||
armor = list("melee" = 20, "bullet" = 10, "laser" = 30, "energy" = 5, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50)
|
||||
|
||||
/obj/item/clothing/suit/armor/vest/russian
|
||||
name = "russian vest"
|
||||
desc = "A bulletproof vest with forest camo. Good thing there's plenty of forests to hide in around here, right?"
|
||||
icon_state = "rus_armor"
|
||||
item_state = "rus_armor"
|
||||
armor = list("melee" = 25, "bullet" = 30, "laser" = 0, "energy" = 15, "bomb" = 10, "bio" = 0, "rad" = 20, "fire" = 20, "acid" = 50)
|
||||
/obj/item/clothing/suit/armor/vest/russian_coat
|
||||
name = "russian battle coat"
|
||||
desc = "Used in extremly cold fronts, made out of real bears."
|
||||
icon_state = "rus_coat"
|
||||
item_state = "rus_coat"
|
||||
clothing_flags = THICKMATERIAL
|
||||
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
|
||||
armor = list("melee" = 25, "bullet" = 20, "laser" = 20, "energy" = 10, "bomb" = 20, "bio" = 50, "rad" = 20, "fire" = -10, "acid" = 50)
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDEFACE|HIDESNOUT
|
||||
resistance_flags = ACID_PROOF
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
|
||||
/obj/item/clothing/suit/bio_suit
|
||||
name = "bio suit"
|
||||
@@ -28,7 +28,7 @@
|
||||
strip_delay = 70
|
||||
equip_delay_other = 70
|
||||
resistance_flags = ACID_PROOF
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC|STYLE_PAW_TAURIC
|
||||
|
||||
//Standard biosuit, orange stripe
|
||||
/obj/item/clothing/head/bio_hood/general
|
||||
|
||||
@@ -207,7 +207,7 @@
|
||||
item_state = "techpriest"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
hoodtype = /obj/item/clothing/head/hooded/techpriest
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/head/hooded/techpriest
|
||||
name = "techpriest's hood"
|
||||
@@ -216,4 +216,4 @@
|
||||
item_state = "techpriesthood"
|
||||
body_parts_covered = HEAD
|
||||
flags_inv = HIDEHAIR|HIDEEARS
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
|
||||
@@ -864,7 +864,7 @@
|
||||
blood_overlay_type = "armor"
|
||||
body_parts_covered = CHEST
|
||||
resistance_flags = NONE
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 5, "bio" = 0, "rad" = 0, "fire" = -5, "acid" = -15) //nylon sucks against acid
|
||||
|
||||
/obj/item/clothing/suit/assu_suit
|
||||
|
||||
@@ -179,8 +179,7 @@
|
||||
RemoveHelmet()
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/proc/ToggleHelmet()
|
||||
var/mob/living/carbon/human/H = src.loc
|
||||
var/datum/species/pref_species = H.dna.species
|
||||
var/mob/living/carbon/human/H = loc
|
||||
if(!helmettype)
|
||||
return
|
||||
if(!helmet)
|
||||
@@ -194,18 +193,6 @@
|
||||
to_chat(H, "<span class='warning'>You're already wearing something on your head!</span>")
|
||||
return
|
||||
else if(H.equip_to_slot_if_possible(helmet,SLOT_HEAD,0,0,1))
|
||||
if(helmet.mutantrace_variation)
|
||||
if("mam_snouts" in pref_species.default_features)
|
||||
if(H.dna.features["mam_snouts"] != "None")
|
||||
helmet.muzzle_var = ALT_STYLE
|
||||
|
||||
else if("snout" in pref_species.default_features)
|
||||
if(H.dna.features["snout"] != "None")
|
||||
helmet.muzzle_var = ALT_STYLE
|
||||
else
|
||||
helmet.muzzle_var = NORMAL_STYLE
|
||||
H.update_inv_head()
|
||||
|
||||
to_chat(H, "<span class='notice'>You engage the helmet on the hardsuit.</span>")
|
||||
suittoggled = TRUE
|
||||
H.update_inv_wear_suit()
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/extinguisher, /obj/item/crowbar)
|
||||
slowdown = 1
|
||||
armor = list("melee" = 15, "bullet" = 5, "laser" = 20, "energy" = 10, "bomb" = 20, "bio" = 10, "rad" = 20, "fire" = 100, "acid" = 50)
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAUR
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
|
||||
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL
|
||||
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
|
||||
@@ -30,11 +30,12 @@
|
||||
strip_delay = 60
|
||||
equip_delay_other = 60
|
||||
resistance_flags = FIRE_PROOF
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
|
||||
/obj/item/clothing/suit/fire/firefighter
|
||||
icon_state = "firesuit"
|
||||
item_state = "firefighter"
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAUR
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC|STYLE_PAW_TAURIC
|
||||
|
||||
|
||||
/obj/item/clothing/suit/fire/heavy
|
||||
@@ -50,6 +51,8 @@
|
||||
icon_state = "atmos_firesuit"
|
||||
item_state = "firesuit_atmos"
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAUR
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC|STYLE_PAW_TAURIC
|
||||
|
||||
/*
|
||||
* Bomb protection
|
||||
@@ -71,7 +74,7 @@
|
||||
equip_delay_other = 70
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
resistance_flags = NONE
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
|
||||
|
||||
/obj/item/clothing/suit/bomb_suit
|
||||
@@ -94,7 +97,7 @@
|
||||
strip_delay = 70
|
||||
equip_delay_other = 70
|
||||
resistance_flags = NONE
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC|STYLE_PAW_TAURIC
|
||||
|
||||
|
||||
/obj/item/clothing/head/bomb_hood/security
|
||||
@@ -131,7 +134,7 @@
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
resistance_flags = NONE
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
|
||||
/obj/item/clothing/suit/radiation
|
||||
name = "radiation suit"
|
||||
@@ -151,4 +154,4 @@
|
||||
flags_inv = HIDEJUMPSUIT|HIDETAUR
|
||||
resistance_flags = NONE
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_ALL_TAURIC
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
siemens_coefficient = 0.5
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/suit/armor/xcomsquaddie/dredd
|
||||
name = "Judge Armor"
|
||||
@@ -18,7 +18,7 @@
|
||||
item_state = "dredd-suit"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
|
||||
/obj/item/clothing/suit/armor/xcomarmor
|
||||
@@ -32,7 +32,7 @@
|
||||
siemens_coefficient = 0.5
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/suit/armor/vest/neorussian
|
||||
name = "neo-Russian vest"
|
||||
@@ -41,7 +41,7 @@
|
||||
item_state = "nr_vest"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/suit/armor/doomguy
|
||||
name = "Doomguy's armor"
|
||||
@@ -53,7 +53,7 @@
|
||||
armor = list(melee = 50, bullet = 30, laser = 20, energy = 20, bomb = 30, bio = 0, rad = 0)
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
|
||||
/obj/item/clothing/suit/kaminacape
|
||||
@@ -63,7 +63,7 @@
|
||||
body_parts_covered = 0
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/suit/officercoat
|
||||
name = "Officer's Coat"
|
||||
@@ -71,7 +71,7 @@
|
||||
icon_state = "officersuit"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/suit/soldiercoat
|
||||
name = "Soldier's Coat"
|
||||
@@ -79,7 +79,7 @@
|
||||
icon_state = "soldiersuit"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/suit/russofurcoat
|
||||
name = "russian fur coat"
|
||||
@@ -89,7 +89,7 @@
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/suit/doshjacket
|
||||
name = "Plasterer's Jacket"
|
||||
@@ -98,7 +98,7 @@
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/suit/maidapron
|
||||
name = "Apron"
|
||||
@@ -107,7 +107,7 @@
|
||||
body_parts_covered = CHEST|GROIN
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/suit/clownpiece
|
||||
name = "small fairy wings"
|
||||
@@ -116,7 +116,7 @@
|
||||
body_parts_covered = 0
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/suit/clownpiece/flying
|
||||
name = "small fairy wings"
|
||||
@@ -124,7 +124,7 @@
|
||||
icon_state = "clownpiece-fly"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/suit/raincoat
|
||||
name = "Raincoat"
|
||||
@@ -133,6 +133,6 @@
|
||||
body_parts_covered =CHEST|GROIN|LEGS|ARMS|HANDS
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = NONE
|
||||
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user