mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-12 07:33:34 +01:00
Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into OrganRefactor
This commit is contained in:
@@ -36,7 +36,7 @@
|
||||
|
||||
#define NO_BLOOD 1
|
||||
#define NO_BREATHE 2
|
||||
#define NO_DNA_RAD 4
|
||||
#define NO_DNA 4
|
||||
#define RAD_ABSORB 8
|
||||
#define NO_SCAN 16
|
||||
#define NO_PAIN 32
|
||||
@@ -48,6 +48,7 @@
|
||||
#define IS_RESTRICTED 2048
|
||||
#define NO_INTORGANS 4096
|
||||
#define NO_POISON 8192
|
||||
#define RADIMMUNE 16384
|
||||
|
||||
//Species clothing flags
|
||||
#define HAS_UNDERWEAR 1
|
||||
|
||||
@@ -27,12 +27,6 @@
|
||||
#define SHUTTLE_TRANSIT_DURATION 300 // 5 minutes = 300 seconds - how long it takes for the shuttle to get to the station
|
||||
#define SHUTTLE_TRANSIT_DURATION_RETURN 120 // 2 minutes = 120 seconds - for some reason it takes less time to come back, go figure.
|
||||
|
||||
//Shuttle moving status
|
||||
#define SHUTTLE_IDLE 0
|
||||
#define SHUTTLE_WARMUP 1
|
||||
#define SHUTTLE_INTRANSIT 2
|
||||
#define SHUTTLE_STRANDED 3
|
||||
|
||||
//Ferry shuttle processing status
|
||||
#define IDLE_STATE 0
|
||||
#define WAIT_LAUNCH 1
|
||||
|
||||
@@ -221,7 +221,7 @@
|
||||
adding += using
|
||||
|
||||
//Shuttle
|
||||
using = new /obj/screen/ai/announcement()
|
||||
using = new /obj/screen/ai/call_shuttle()
|
||||
using.name = "Call Emergency Shuttle"
|
||||
using.icon = 'icons/mob/screen_ai.dmi'
|
||||
using.icon_state = "call_shuttle"
|
||||
|
||||
@@ -120,7 +120,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
|
||||
|
||||
var/area/signal_origin = get_area(user)
|
||||
var/emergency_reason = "\nNature of emergency:\n\n[call_reason]"
|
||||
if(seclevel2num(get_security_level()) == SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes.
|
||||
if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes.
|
||||
emergency.request(null, 0.5, signal_origin, html_decode(emergency_reason), 1)
|
||||
else
|
||||
emergency.request(null, 1, signal_origin, html_decode(emergency_reason), 0)
|
||||
@@ -142,7 +142,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
|
||||
return
|
||||
if(ticker.mode.name == "meteor")
|
||||
return
|
||||
if(seclevel2num(get_security_level()) == SEC_LEVEL_RED)
|
||||
if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED)
|
||||
if(emergency.timeLeft(1) < emergencyCallTime * 0.25)
|
||||
return
|
||||
else
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
var/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard
|
||||
var/traitor_scaling = 0 //if amount of traitors scales based on amount of players
|
||||
var/protect_roles_from_antagonist = 0// If security and such can be tratior/cult/other
|
||||
var/continous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke.
|
||||
var/continuous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke.
|
||||
var/allow_Metadata = 0 // Metadata is supported.
|
||||
var/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1.
|
||||
var/Ticklag = 0.9
|
||||
@@ -449,7 +449,7 @@
|
||||
config.gateway_delay = text2num(value)
|
||||
|
||||
if("continuous_rounds")
|
||||
config.continous_rounds = 1
|
||||
config.continuous_rounds = 1
|
||||
|
||||
if("ghost_interaction")
|
||||
config.ghost_interaction = 1
|
||||
|
||||
@@ -65,7 +65,9 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
caster.reset_view(0)
|
||||
return 0
|
||||
|
||||
if((user.z in config.admin_levels) && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel
|
||||
if(user.z == ZLEVEL_CENTCOMM && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel
|
||||
return 0
|
||||
if(user.z == ZLEVEL_CENTCOMM && ticker.mode.name == "ragin' mages")
|
||||
return 0
|
||||
|
||||
if(!skipcharge)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/effect/proc_holder/spell/targeted/charge
|
||||
name = "Charge"
|
||||
desc = "This spell can be used to charge up spent magical artifacts, among other things."
|
||||
desc = "This spell can be used to recharge a variety of things in your hands, from magical artifacts to electrical components. A creative wizard can even use it to grant magical power to a fellow magic user."
|
||||
|
||||
school = "transmutation"
|
||||
charge_max = 600
|
||||
@@ -8,38 +8,45 @@
|
||||
invocation = "DIRI CEL"
|
||||
invocation_type = "whisper"
|
||||
range = -1
|
||||
// cooldown_min = 400 //50 deciseconds reduction per rank
|
||||
cooldown_min = 400 //50 deciseconds reduction per rank
|
||||
include_user = 1
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/charge/cast(list/targets)
|
||||
for(var/mob/living/user in targets)
|
||||
var/list/hand_items = list(user.get_active_hand(),user.get_inactive_hand())
|
||||
/obj/effect/proc_holder/spell/targeted/charge/cast(list/targets,mob/user = usr)
|
||||
for(var/mob/living/L in targets)
|
||||
var/list/hand_items = list(L.get_active_hand(),L.get_inactive_hand())
|
||||
var/charged_item = null
|
||||
var/burnt_out = 0
|
||||
|
||||
if(L.pulling && (istype(L.pulling, /mob/living)))
|
||||
var/mob/living/M = L.pulling
|
||||
if(M.spell_list.len != 0 || (M.mind && M.mind.spell_list.len != 0))
|
||||
for(var/obj/effect/proc_holder/spell/S in M.spell_list)
|
||||
S.charge_counter = S.charge_max
|
||||
if(M.mind)
|
||||
for(var/obj/effect/proc_holder/spell/S in M.mind.spell_list)
|
||||
S.charge_counter = S.charge_max
|
||||
M <<"<span class='notice'>you feel raw magic flowing through you, it feels good!</span>"
|
||||
else
|
||||
M <<"<span class='notice'>you feel very strange for a moment, but then it passes.</span>"
|
||||
burnt_out = 1
|
||||
charged_item = M
|
||||
break
|
||||
for(var/obj/item in hand_items)
|
||||
if(istype(item, /obj/item/weapon/grab))
|
||||
var/obj/item/weapon/grab/G = item
|
||||
if(G.affecting)
|
||||
var/mob/M = G.affecting
|
||||
if(M.spell_list.len != 0)
|
||||
for(var/obj/effect/proc_holder/spell/S in M.spell_list)
|
||||
S.charge_counter = S.charge_max
|
||||
M <<"<span class='notice'>you feel raw magic flowing through you, it feels good!</span>"
|
||||
if(istype(item, /obj/item/weapon/spellbook))
|
||||
if(istype(item, /obj/item/weapon/spellbook/oneuse))
|
||||
var/obj/item/weapon/spellbook/oneuse/I = item
|
||||
if(prob(80))
|
||||
L.visible_message("<span class='warning'>[I] catches fire!</span>")
|
||||
qdel(I)
|
||||
else
|
||||
M <<"<span class='notice'>you feel very strange for a moment, but then it passes.</span>"
|
||||
burnt_out = 1
|
||||
charged_item = M
|
||||
break
|
||||
else if(istype(item, /obj/item/weapon/spellbook/oneuse))
|
||||
var/obj/item/weapon/spellbook/oneuse/I = item
|
||||
if(prob(80))
|
||||
user.visible_message("<span class='warning'>[I] catches fire!</span>")
|
||||
qdel(I)
|
||||
I.used = 0
|
||||
charged_item = I
|
||||
break
|
||||
else
|
||||
I.used = 0
|
||||
charged_item = I
|
||||
break
|
||||
L << "<span class='caution'>Glowing red letters appear on the front cover...</span>"
|
||||
L << "<span class='warning'>[pick("NICE TRY BUT NO!","CLEVER BUT NOT CLEVER ENOUGH!", "SUCH FLAGRANT CHEESING IS WHY WE ACCEPTED YOUR APPLICATION!", "CUTE!", "YOU DIDN'T THINK IT'D BE THAT EASY, DID YOU?")]</span>"
|
||||
burnt_out = 1
|
||||
else if(istype(item, /obj/item/weapon/gun/magic))
|
||||
var/obj/item/weapon/gun/magic/I = item
|
||||
if(prob(80) && !I.can_charge)
|
||||
@@ -78,8 +85,8 @@
|
||||
charged_item = item
|
||||
break
|
||||
if(!charged_item)
|
||||
user << "<span class='notice'>you feel magical power surging to your hands, but the feeling rapidly fades...</span>"
|
||||
L << "<span class='notice'>you feel magical power surging to your hands, but the feeling rapidly fades...</span>"
|
||||
else if(burnt_out)
|
||||
user << "<span class='caution'>[charged_item] doesn't seem to be reacting to the spell...</span>"
|
||||
L << "<span class='caution'>[charged_item] doesn't seem to be reacting to the spell...</span>"
|
||||
else
|
||||
user << "<span class='notice'>[charged_item] suddenly feels very warm!</span>"
|
||||
L << "<span class='notice'>[charged_item] suddenly feels very warm!</span>"
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "Genetic"
|
||||
desc = "This spell inflicts a set of mutations and disabilities upon the target."
|
||||
|
||||
var/disabilities = 0 //bits
|
||||
var/sdisabilities = 0 //bits
|
||||
var/list/mutations = list() //mutation strings
|
||||
var/duration = 100 //deciseconds
|
||||
/*
|
||||
@@ -22,11 +22,11 @@
|
||||
target.mutations.Add(x)
|
||||
/* if(x == HULK && ishuman(target))
|
||||
target:hulk_time=world.time + duration */
|
||||
target.disabilities |= disabilities
|
||||
target.sdisabilities |= sdisabilities
|
||||
target.update_mutations() //update target's mutation overlays
|
||||
spawn(duration)
|
||||
target.mutations.Remove(mutations)
|
||||
target.disabilities &= ~disabilities
|
||||
target.sdisabilities &= ~sdisabilities
|
||||
target.update_mutations()
|
||||
|
||||
return
|
||||
@@ -0,0 +1,22 @@
|
||||
/obj/effect/proc_holder/spell/targeted/infinite_guns
|
||||
name = "Lesser Summon Guns"
|
||||
desc = "Why reload when you have infinite guns? Summons an unending stream of bolt action rifles. Requires both hands free to use."
|
||||
invocation_type = "none"
|
||||
include_user = 1
|
||||
range = -1
|
||||
|
||||
school = "conjuration"
|
||||
charge_max = 750
|
||||
clothes_req = 1
|
||||
cooldown_min = 10 //Gun wizard
|
||||
action_icon_state = "bolt_action"
|
||||
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/infinite_guns/cast(list/targets, mob/user = usr)
|
||||
for(var/mob/living/carbon/C in targets)
|
||||
C.drop_item()
|
||||
C.swap_hand()
|
||||
C.drop_item()
|
||||
var/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted/GUN = new
|
||||
C.put_in_hands(GUN)
|
||||
@@ -22,4 +22,11 @@
|
||||
var/obj/machinery/door/airlock/A = door
|
||||
A.unlock(1) //forced because it's magic!
|
||||
door.open()
|
||||
for(var/obj/structure/closet/C in T.contents)
|
||||
spawn(1)
|
||||
if(istype(C, /obj/structure/closet/secure_closet))
|
||||
var/obj/structure/closet/secure_closet/SC = C
|
||||
SC.locked = 0
|
||||
C.open()
|
||||
|
||||
return
|
||||
@@ -0,0 +1,130 @@
|
||||
/obj/effect/proc_holder/spell/targeted/lichdom
|
||||
name = "Bind Soul"
|
||||
desc = "A dark necromantic pact that can forever bind your soul to an item of your choosing. So long as both your body and the item remain intact and on the same plane you can revive from death, though the time between reincarnations grows steadily with use."
|
||||
school = "necromancy"
|
||||
charge_max = 10
|
||||
clothes_req = 0
|
||||
centcom_cancast = 0
|
||||
invocation = "NECREM IMORTIUM!"
|
||||
invocation_type = "shout"
|
||||
range = -1
|
||||
level_max = 0 //cannot be improved
|
||||
cooldown_min = 10
|
||||
include_user = 1
|
||||
|
||||
var/obj/marked_item
|
||||
var/mob/living/current_body
|
||||
var/resurrections = 0
|
||||
var/existence_stops_round_end = 0
|
||||
|
||||
action_icon_state = "skeleton"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/lichdom/New()
|
||||
if(!config.continuous_rounds)
|
||||
existence_stops_round_end = 1
|
||||
config.continuous_rounds = 1
|
||||
..()
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/lichdom/Destroy()
|
||||
for(var/datum/mind/M in ticker.mode.wizards) //Make sure no other bones are about
|
||||
for(var/obj/effect/proc_holder/spell/S in M.spell_list)
|
||||
if(istype(S,/obj/effect/proc_holder/spell/targeted/lichdom) && S != src)
|
||||
return ..()
|
||||
if(existence_stops_round_end)
|
||||
config.continuous_rounds = 0
|
||||
return ..()
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/lichdom/cast(list/targets,mob/user = usr)
|
||||
for(var/mob/M in targets)
|
||||
var/list/hand_items = list()
|
||||
if(iscarbon(M))
|
||||
hand_items = list(M.get_active_hand(),M.get_inactive_hand())
|
||||
|
||||
if(marked_item && !stat_allowed) //sanity, shouldn't happen without badminry
|
||||
marked_item = null
|
||||
return
|
||||
|
||||
if(stat_allowed) //Death is not my end!
|
||||
if(M.stat == CONSCIOUS && iscarbon(M))
|
||||
M << "<span class='notice'>You aren't dead enough to revive!</span>" //Usually a good problem to have
|
||||
charge_counter = charge_max
|
||||
return
|
||||
|
||||
if(!marked_item || qdeleted(marked_item)) //Wait nevermind
|
||||
M << "<span class='warning'>Your phylactery is gone!</span>"
|
||||
return
|
||||
|
||||
var/turf/user_turf = get_turf(M)
|
||||
var/turf/item_turf = get_turf(marked_item)
|
||||
|
||||
if(user_turf.z != item_turf.z)
|
||||
M << "<span class='warning'>Your phylactery is out of range!</span>"
|
||||
return
|
||||
|
||||
if(isobserver(M))
|
||||
var/mob/dead/observer/O = M
|
||||
O.reenter_corpse()
|
||||
|
||||
var/mob/living/carbon/human/lich = new /mob/living/carbon/human(item_turf)
|
||||
|
||||
lich.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(lich), slot_shoes)
|
||||
lich.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(lich), slot_w_uniform)
|
||||
lich.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(lich), slot_wear_suit)
|
||||
lich.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(lich), slot_head)
|
||||
|
||||
lich.real_name = M.mind.name
|
||||
M.mind.transfer_to(lich)
|
||||
lich.set_species("Skeleton")
|
||||
lich << "<span class='warning'>Your bones clatter and shutter as they're pulled back into this world!</span>"
|
||||
charge_max += 600
|
||||
var/mob/old_body = current_body
|
||||
var/turf/body_turf = get_turf(old_body)
|
||||
current_body = lich
|
||||
lich.Weaken(10+10*resurrections)
|
||||
++resurrections
|
||||
if(old_body && old_body.loc)
|
||||
if(iscarbon(old_body))
|
||||
var/mob/living/carbon/C = old_body
|
||||
for(var/obj/item/W in C)
|
||||
C.unEquip(W)
|
||||
var/wheres_wizdo = dir2text(get_dir(body_turf, item_turf))
|
||||
if(wheres_wizdo)
|
||||
old_body.visible_message("<span class='warning'>Suddenly [old_body.name]'s corpse falls to pieces! You see a strange energy rise from the remains, and speed off towards the [wheres_wizdo]!</span>")
|
||||
body_turf.Beam(item_turf,icon_state="lichbeam",icon='icons/effects/effects.dmi',time=10+10*resurrections,maxdistance=INFINITY)
|
||||
old_body.dust()
|
||||
|
||||
if(!marked_item) //linking item to the spell
|
||||
message = "<span class='warning'>"
|
||||
for(var/obj/item in hand_items)
|
||||
if(ABSTRACT in item.flags || NODROP in item.flags)
|
||||
continue
|
||||
marked_item = item
|
||||
M << "<span class='warning'>You begin to focus your very being into the [item.name]...</span>"
|
||||
break
|
||||
|
||||
if(!marked_item)
|
||||
M << "<span class='caution'>You must hold an item you wish to make your phylactery...</span>"
|
||||
return
|
||||
|
||||
spawn(50)
|
||||
if(marked_item.loc != M) //I changed my mind I don't want to put my soul in a cheeseburger!
|
||||
M << "<span class='warning'>Your soul snaps back to your body as you drop the [marked_item.name]!</span>"
|
||||
marked_item = null
|
||||
return
|
||||
name = "RISE!"
|
||||
desc = "Rise from the dead! You will reform at the location of your phylactery and your old body will crumble away."
|
||||
charge_max = 1800 //3 minute cooldown, if you rise in sight of someone and killed again, you're probably screwed.
|
||||
charge_counter = 1800
|
||||
stat_allowed = 1
|
||||
marked_item.name = "Ensouled [marked_item.name]"
|
||||
marked_item.desc = "A terrible aura surrounds this item, its very existence is offensive to life itself..."
|
||||
marked_item.color = "#003300"
|
||||
M << "<span class='userdanger'>With a hideous feeling of emptiness you watch in horrified fascination as skin sloughs off bone! Blood boils, nerves disintegrate, eyes boil in their sockets! As your organs crumble to dust in your fleshless chest you come to terms with your choice. You're a lich!</span>"
|
||||
current_body = M.mind.current
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
H.set_species("Skeleton")
|
||||
H.unEquip(H.wear_suit)
|
||||
H.unEquip(H.head)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(H), slot_wear_suit)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(H), slot_head)
|
||||
@@ -7,7 +7,7 @@
|
||||
invocation = "GAR YOK"
|
||||
invocation_type = "whisper"
|
||||
range = -1
|
||||
level_max = 1 //cannot be improved
|
||||
level_max = 0 //cannot be improved
|
||||
cooldown_min = 100
|
||||
include_user = 1
|
||||
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
desc = "This spell fires several, slow moving, magic projectiles at nearby targets."
|
||||
|
||||
school = "evocation"
|
||||
charge_max = 150
|
||||
charge_max = 200
|
||||
clothes_req = 1
|
||||
invocation = "FORTI GY AMA"
|
||||
invocation_type = "shout"
|
||||
range = 7
|
||||
cooldown_min = 90 //15 deciseconds reduction per rank
|
||||
cooldown_min = 60 //35 deciseconds reduction per rank
|
||||
|
||||
max_targets = 0
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/inflict_handler/magic_missile
|
||||
amt_weakened = 3
|
||||
amt_dam_fire = 10
|
||||
|
||||
/obj/effect/proc_holder/spell/noclothes
|
||||
name = "No Clothes"
|
||||
@@ -225,7 +224,7 @@
|
||||
amt_eye_blurry = 20
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/genetic/blind
|
||||
disabilities = 1
|
||||
sdisabilities = BLIND
|
||||
duration = 300
|
||||
|
||||
/obj/effect/proc_holder/spell/dumbfire/fireball
|
||||
@@ -261,6 +260,7 @@
|
||||
ex_severe = -1
|
||||
ex_heavy = -1
|
||||
ex_light = 2
|
||||
ex_flash = 5
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/repulse
|
||||
name = "Repulse"
|
||||
|
||||
@@ -1228,8 +1228,8 @@ var/list/ghostteleportlocs = list()
|
||||
/area/holodeck/source_space
|
||||
name = "\improper Holodeck - Space"
|
||||
|
||||
|
||||
|
||||
/area/holodeck/source_knightarena
|
||||
name = "\improper Holodeck - Knight Arena"
|
||||
|
||||
|
||||
//Embassies
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
// flags: See below, bitfield.
|
||||
#define MUTCHK_FORCED 1
|
||||
/proc/domutcheck(var/mob/living/M, var/connected=null, var/flags=0)
|
||||
|
||||
|
||||
for(var/datum/dna/gene/gene in dna_genes)
|
||||
if(!M || !M.dna)
|
||||
return
|
||||
@@ -52,7 +52,7 @@
|
||||
/proc/genemutcheck(var/mob/living/M, var/block, var/connected=null, var/flags=0)
|
||||
if(ishuman(M)) // Would've done this via species instead of type, but the basic mob doesn't have a species, go figure.
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.species.flags & NO_DNA_RAD)
|
||||
if(H.species.flags & NO_DNA)
|
||||
return
|
||||
if(!M)
|
||||
return
|
||||
@@ -76,12 +76,12 @@
|
||||
var/gene_active = (gene.flags & GENE_ALWAYS_ACTIVATE)
|
||||
if(!gene_active)
|
||||
gene_active = M.dna.GetSEState(gene.block)
|
||||
|
||||
|
||||
var/defaultgenes // Do not mutate inherent species abilities
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
defaultgenes = H.species.default_genes
|
||||
|
||||
|
||||
if((gene in defaultgenes) && gene_active)
|
||||
return
|
||||
|
||||
|
||||
@@ -326,7 +326,7 @@
|
||||
|
||||
if(ishuman(occupant))
|
||||
var/mob/living/carbon/human/H = occupant
|
||||
if((H.species.flags & NO_DNA_RAD))
|
||||
if((H.species.flags & NO_DNA))
|
||||
return 1
|
||||
|
||||
var/radiation_protection = occupant.run_armor_check(null, "rad", "Your clothes feel warm.", "Your clothes feel warm.")
|
||||
@@ -518,7 +518,7 @@
|
||||
occupantData["structuralEnzymes"] = null
|
||||
occupantData["radiationLevel"] = null
|
||||
else
|
||||
occupantData["name"] = connected.occupant.name
|
||||
occupantData["name"] = connected.occupant.dna.real_name
|
||||
occupantData["stat"] = connected.occupant.stat
|
||||
occupantData["isViableSubject"] = 1
|
||||
if ((NOCLONE in connected.occupant.mutations && connected.scan_level < 3) || !src.connected.occupant.dna)
|
||||
@@ -853,7 +853,7 @@
|
||||
databuf.types = DNA2_BUF_UI|DNA2_BUF_UE
|
||||
databuf.dna = src.connected.occupant.dna.Clone()
|
||||
if(ishuman(connected.occupant))
|
||||
databuf.dna.real_name=connected.occupant.name
|
||||
databuf.dna.real_name=connected.occupant.dna.real_name
|
||||
databuf.name = "Unique Identifier + Unique Enzymes"
|
||||
src.buffers[bufferId] = databuf
|
||||
return 1
|
||||
@@ -864,7 +864,7 @@
|
||||
databuf.types = DNA2_BUF_SE
|
||||
databuf.dna = src.connected.occupant.dna.Clone()
|
||||
if(ishuman(connected.occupant))
|
||||
databuf.dna.real_name=connected.occupant.name
|
||||
databuf.dna.real_name=connected.occupant.dna.real_name
|
||||
databuf.name = "Structural Enzymes"
|
||||
src.buffers[bufferId] = databuf
|
||||
return 1
|
||||
|
||||
@@ -385,7 +385,7 @@
|
||||
// playsound(H.loc, 'male_fallscream.ogg', 50, 0)
|
||||
//playsound(H.loc, 'bubbles.ogg', 50, 0)
|
||||
//playsound(H.loc, 'loudcrunch2.ogg', 50, 0)
|
||||
var/mob/living/carbon/human/skellington/nH = new /mob/living/carbon/human/skellington(H.loc, delay_ready_dna=1)
|
||||
var/mob/living/carbon/human/skeleton/nH = new /mob/living/carbon/human/skeleton(H.loc, delay_ready_dna=1)
|
||||
nH.real_name = H.real_name
|
||||
nH.name = "[H.name]'s skeleton"
|
||||
//H.decomp_stage = 4
|
||||
|
||||
@@ -316,7 +316,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
|
||||
user << "<span class='warning'>DNA of [target] is ruined beyond usability!</span>"
|
||||
return
|
||||
|
||||
if(T.species.flags & NO_DNA_RAD)
|
||||
if(T.species.flags & NO_DNA)
|
||||
user << "<span class='warning'>This creature does not have DNA!</span>"
|
||||
return
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
if((NOCLONE || SKELETON || HUSK) in target.mutations)
|
||||
user << "<span class='warning'>DNA of [target] is ruined beyond usability!</span>"
|
||||
return
|
||||
if(!istype(target) || issmall(target) || target.species.flags & NO_DNA_RAD || target.species.flags & NO_SCAN || target.species.flags & NO_BLOOD)
|
||||
if(!istype(target) || issmall(target) || target.species.flags & NO_DNA || target.species.flags & NO_SCAN || target.species.flags & NO_BLOOD)
|
||||
user << "<span class='warning'>[target] is not compatible with this ability.</span>"
|
||||
return
|
||||
return 1
|
||||
|
||||
@@ -7,7 +7,6 @@ var/round_start_time = 0
|
||||
|
||||
var/hide_mode = 0 // leave here at 0 ! setup() will take care of it when needed for Secret mode -walter0o
|
||||
var/datum/game_mode/mode = null
|
||||
var/post_game = 0
|
||||
var/event_time = null
|
||||
var/event = 0
|
||||
|
||||
@@ -386,16 +385,13 @@ var/round_start_time = 0
|
||||
|
||||
//emergency_shuttle.process() DONE THROUGH PROCESS SCHEDULER
|
||||
|
||||
var/game_finished = 0
|
||||
var/mode_finished = 0
|
||||
if (config.continous_rounds)
|
||||
game_finished = (mode.station_was_nuked)
|
||||
mode_finished = (!post_game && mode.check_finished())
|
||||
var/game_finished = shuttle_master.emergency.mode >= SHUTTLE_ENDGAME || mode.station_was_nuked
|
||||
if (config.continuous_rounds)
|
||||
mode.check_finished() // some modes contain var-changing code in here, so call even if we don't uses result
|
||||
else
|
||||
game_finished = (mode.check_finished())
|
||||
mode_finished = game_finished
|
||||
game_finished |= mode.check_finished()
|
||||
|
||||
if(!mode.explosion_in_progress && game_finished && (mode_finished || post_game))
|
||||
if(!mode.explosion_in_progress && game_finished)
|
||||
current_state = GAME_STATE_FINISHED
|
||||
auto_toggle_ooc(1) // Turn it on
|
||||
spawn
|
||||
@@ -409,18 +405,6 @@ var/round_start_time = 0
|
||||
else
|
||||
world.Reboot("Round ended.", "end_proper", "proper completion")
|
||||
|
||||
else if (mode_finished)
|
||||
post_game = 1
|
||||
|
||||
mode.cleanup()
|
||||
|
||||
//call a transfer shuttle vote
|
||||
spawn(50)
|
||||
if(!round_end_announced) // Spam Prevention. Now it should announce only once.
|
||||
world << "\red The round has ended!"
|
||||
round_end_announced = 1
|
||||
vote.autotransfer()
|
||||
|
||||
return 1
|
||||
|
||||
proc/getfactionbyname(var/name)
|
||||
|
||||
@@ -148,7 +148,7 @@
|
||||
if (station_captured && !to_nuke_or_not_to_nuke)
|
||||
return 1
|
||||
if (is_malf_ai_dead())
|
||||
if(config.continous_rounds)
|
||||
if(config.continuous_rounds)
|
||||
if(shuttle_master && shuttle_master.emergencyNoEscape)
|
||||
shuttle_master.emergencyNoEscape = 0
|
||||
malf_mode_declared = 0
|
||||
|
||||
@@ -111,10 +111,7 @@
|
||||
..()
|
||||
statpanel("Status")
|
||||
|
||||
if(shuttle_master.emergency.mode >= SHUTTLE_RECALL)
|
||||
var/timeleft = shuttle_master.emergency.timeLeft()
|
||||
if(timeleft > 0)
|
||||
stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]")
|
||||
show_stat_emergency_shuttle_eta()
|
||||
|
||||
if (client.statpanel == "Status")
|
||||
stat("Chemicals", chemicals)
|
||||
|
||||
@@ -262,6 +262,9 @@
|
||||
/obj/machinery/porta_turret/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
|
||||
S << "<span class='warning'>Attempting to dismantle this machine would result in an immediate counterattack. Aborting.</span>"
|
||||
|
||||
/obj/spacepod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
|
||||
S << "<span class='warning'>Destroying this vehicle would destroy us. Aborting.</span>"
|
||||
|
||||
/mob/living/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
|
||||
S.DisperseTarget(src)
|
||||
|
||||
|
||||
@@ -102,7 +102,7 @@ datum/game_mode/nations
|
||||
H << "You are now part of the great sovereign nation of [H.mind.nation.default_name]!"
|
||||
continue
|
||||
|
||||
if(H.mind.assigned_role in support_positions)
|
||||
if(H.mind.assigned_role in (support_positions + command_positions))
|
||||
H.mind.nation = all_nations["People's Republic of Commandzakstan"]
|
||||
update_nations_icons_added(H,"hudcommand")
|
||||
H.mind.nation.membership += H.mind.current
|
||||
@@ -113,16 +113,6 @@ datum/game_mode/nations
|
||||
H << "You are now part of the great sovereign nation of [H.mind.nation.default_name]!"
|
||||
continue
|
||||
|
||||
if(H.mind.assigned_role in command_positions)
|
||||
H.mind.nation = all_nations["People's Republic of Commandzakstan"]
|
||||
update_nations_icons_added(H,"hudcommand")
|
||||
H.mind.nation.membership += H.mind.current
|
||||
if(H.mind.assigned_role == H.mind.nation.default_leader)
|
||||
H.mind.nation.current_leader = H.mind.current
|
||||
H << "You have been chosen to lead the nation of [H.mind.nation.default_name]!"
|
||||
continue
|
||||
H << "You are now part of the great sovereign nation of [H.mind.nation.default_name]!"
|
||||
continue
|
||||
if(H.mind.assigned_role in civilian_positions)
|
||||
H << "You do not belong to any nation and are free to sell your services to the highest bidder."
|
||||
continue
|
||||
@@ -182,8 +172,6 @@ datum/game_mode/nations
|
||||
|
||||
if(!mode.kickoff) return 1
|
||||
|
||||
var/list/cargonians = list("Quartermaster","Cargo Technician","Shaft Miner")
|
||||
var/list/servicion = list("Clown", "Mime", "Bartender", "Chef", "Botanist")
|
||||
if(H.mind)
|
||||
if(H.mind.assigned_role in engineering_positions)
|
||||
H.mind.nation = all_nations["Atmosia"]
|
||||
@@ -213,33 +201,27 @@ datum/game_mode/nations
|
||||
H << "You are now part of the great sovereign nation of [H.mind.nation.current_name]!"
|
||||
return 1
|
||||
|
||||
if(H.mind.assigned_role in cargonians)
|
||||
if(H.mind.assigned_role in mode.cargonians)
|
||||
H.mind.nation = all_nations["Cargonia"]
|
||||
mode.update_nations_icons_added(H,"hudcargonia")
|
||||
H.mind.nation.membership += H.mind.current
|
||||
H << "You are now part of the great sovereign nation of [H.mind.nation.current_name]!"
|
||||
return 1
|
||||
|
||||
if(H.mind.assigned_role in servicion)
|
||||
if(H.mind.assigned_role in mode.servicion)
|
||||
H.mind.nation = all_nations["Servicion"]
|
||||
mode.update_nations_icons_added(H,"hudservice")
|
||||
H.mind.nation.membership += H.mind.current
|
||||
H << "You are now part of the great sovereign nation of [H.mind.nation.current_name]!"
|
||||
return 1
|
||||
|
||||
if(H.mind.assigned_role in support_positions)
|
||||
H.mind.nation = all_nations["People's Republic of Commandzakstan"]
|
||||
mode.update_nations_icons_added(H,"hudcommand")
|
||||
H.mind.nation.membership += H.mind.current
|
||||
H << "You are now part of the great sovereign nation of [H.mind.nation.current_name]!"
|
||||
return 1
|
||||
|
||||
if(H.mind.assigned_role in command_positions)
|
||||
if(H.mind.assigned_role in (support_positions + command_positions))
|
||||
H.mind.nation = all_nations["People's Republic of Commandzakstan"]
|
||||
mode.update_nations_icons_added(H,"hudcommand")
|
||||
H.mind.nation.membership += H.mind.current
|
||||
H << "You are now part of the great sovereign nation of [H.mind.nation.current_name]!"
|
||||
return 1
|
||||
|
||||
if(H.mind.assigned_role in civilian_positions)
|
||||
H << "You do not belong to any nation and are free to sell your services to the highest bidder."
|
||||
return 1
|
||||
|
||||
@@ -203,15 +203,11 @@
|
||||
//Checks if the round is over//
|
||||
///////////////////////////////
|
||||
/datum/game_mode/revolution/check_finished()
|
||||
if(config.continous_rounds)
|
||||
if(config.continuous_rounds)
|
||||
if(finished != 0)
|
||||
if(shuttle_master && shuttle_master.emergencyNoEscape)
|
||||
shuttle_master.emergencyNoEscape = 0
|
||||
return ..()
|
||||
if(finished != 0)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
return finished != 0
|
||||
|
||||
///////////////////////////////////////////////////
|
||||
//Deals with converting players to the revolution//
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/datum/game_mode/wizard/raginmages
|
||||
name = "Ragin' Mages"
|
||||
name = "ragin' mages"
|
||||
config_tag = "raginmages"
|
||||
required_players = 1
|
||||
required_players_secret = 15
|
||||
|
||||
@@ -1,15 +1,19 @@
|
||||
|
||||
|
||||
/mob/proc/rightandwrong(var/summon_type) //0 = Summon Guns, 1 = Summon Magic
|
||||
var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","silenced","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg")
|
||||
var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffhealing", "armor", "scrying", "staffdoor", "special","voodoo")
|
||||
var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg","uzi","turret","pulsecarbine","decloner","mindflayer","hyperkinetic","advplasmacutter","wormhole","wt550","grenadelauncher","medibeam")
|
||||
var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffhealing", "armor", "scrying", "staffdoor", "special","voodoo","special")
|
||||
var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos","necromantic")
|
||||
|
||||
usr << "<B>You summoned [summon_type ? "magic" : "guns"]!</B>"
|
||||
message_admins("[key_name_admin(usr)] summoned [summon_type ? "magic" : "guns"]!")
|
||||
|
||||
for(var/mob/living/carbon/human/H in player_list)
|
||||
if(H.stat == 2 || !(H.client)) continue
|
||||
if(H.stat == 2 || !(H.client))
|
||||
continue
|
||||
if(H.mind)
|
||||
if(H.mind.special_role == "Wizard" || H.mind.special_role == "apprentice") continue
|
||||
if(H.mind.special_role == "Wizard" || H.mind.special_role == "apprentice")
|
||||
continue
|
||||
var/randomizeguns = pick(gunslist)
|
||||
var/randomizemagic = pick(magiclist)
|
||||
var/randomizemagicspecial = pick(magicspeciallist)
|
||||
@@ -25,43 +29,65 @@
|
||||
new /obj/item/weapon/gun/projectile/revolver(get_turf(H))
|
||||
if("detective")
|
||||
new /obj/item/weapon/gun/projectile/revolver/detective(get_turf(H))
|
||||
if("c20r")
|
||||
new /obj/item/weapon/gun/projectile/automatic/c20r(get_turf(H))
|
||||
if("nuclear")
|
||||
new /obj/item/weapon/gun/energy/gun/nuclear(get_turf(H))
|
||||
if("deagle")
|
||||
new /obj/item/weapon/gun/projectile/automatic/pistol/deagle/camo(get_turf(H))
|
||||
if("gyrojet")
|
||||
new /obj/item/weapon/gun/projectile/automatic/gyropistol(get_turf(H))
|
||||
if("pulse")
|
||||
new /obj/item/weapon/gun/energy/pulse_rifle(get_turf(H))
|
||||
if("silenced")
|
||||
if("suppressed")
|
||||
new /obj/item/weapon/gun/projectile/automatic/pistol(get_turf(H))
|
||||
new /obj/item/weapon/suppressor(get_turf(H))
|
||||
if("cannon")
|
||||
new /obj/item/weapon/gun/energy/lasercannon(get_turf(H))
|
||||
if("doublebarrel")
|
||||
new /obj/item/weapon/gun/projectile/revolver/doublebarrel(get_turf(H))
|
||||
if("shotgun")
|
||||
new /obj/item/weapon/gun/projectile/shotgun/(get_turf(H))
|
||||
new /obj/item/weapon/gun/projectile/shotgun(get_turf(H))
|
||||
if("combatshotgun")
|
||||
new /obj/item/weapon/gun/projectile/shotgun/automatic/combat(get_turf(H))
|
||||
if("bulldog")
|
||||
new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(get_turf(H))
|
||||
if("arg")
|
||||
new /obj/item/weapon/gun/projectile/automatic/ar(get_turf(H))
|
||||
if("mateba")
|
||||
new /obj/item/weapon/gun/projectile/revolver/mateba(get_turf(H))
|
||||
if("boltaction")
|
||||
new /obj/item/weapon/gun/projectile/shotgun/boltaction(get_turf(H))
|
||||
if("uzi")
|
||||
new /obj/item/weapon/gun/projectile/automatic/mini_uzi(get_turf(H))
|
||||
if("cannon")
|
||||
new /obj/item/weapon/gun/energy/lasercannon(get_turf(H))
|
||||
if("crossbow")
|
||||
new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow/large(get_turf(H))
|
||||
if("nuclear")
|
||||
new /obj/item/weapon/gun/energy/gun/nuclear(get_turf(H))
|
||||
if("sabr")
|
||||
new /obj/item/weapon/gun/projectile/automatic/proto(get_turf(H))
|
||||
if("crossbow")
|
||||
new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow(get_turf(H))
|
||||
if("bulldog")
|
||||
new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(get_turf(H))
|
||||
if("c20r")
|
||||
new /obj/item/weapon/gun/projectile/automatic/c20r(get_turf(H))
|
||||
if("saw")
|
||||
new /obj/item/weapon/gun/projectile/automatic/l6_saw(get_turf(H))
|
||||
if("car")
|
||||
new /obj/item/weapon/gun/projectile/automatic/m90(get_turf(H))
|
||||
if("boltaction")
|
||||
new /obj/item/weapon/gun/projectile/shotgun/boltaction(get_turf(H))
|
||||
if("turret")
|
||||
new /obj/item/weapon/gun/energy/gun/turret(get_turf(H))
|
||||
if("pulsecarbine")
|
||||
new /obj/item/weapon/gun/energy/pulse_rifle/carbine(get_turf(H))
|
||||
if("decloner")
|
||||
new /obj/item/weapon/gun/energy/decloner(get_turf(H))
|
||||
if("mindflayer")
|
||||
new /obj/item/weapon/gun/energy/mindflayer(get_turf(H))
|
||||
if("hyperkinetic")
|
||||
new /obj/item/weapon/gun/energy/kinetic_accelerator/hyper(get_turf(H))
|
||||
if("advplasmacutter")
|
||||
new /obj/item/weapon/gun/energy/plasmacutter/adv(get_turf(H))
|
||||
if("wormhole")
|
||||
new /obj/item/weapon/gun/energy/wormhole_projector(get_turf(H))
|
||||
if("wt550")
|
||||
new /obj/item/weapon/gun/projectile/automatic/wt550(get_turf(H))
|
||||
if("grenadelauncher")
|
||||
new /obj/item/weapon/gun/projectile/revolver/grenadelauncher(get_turf(H))
|
||||
if("medibeam")
|
||||
new /obj/item/weapon/gun/medbeam(get_turf(H))
|
||||
else
|
||||
switch (randomizemagic)
|
||||
if("fireball")
|
||||
@@ -80,6 +106,8 @@
|
||||
new /obj/item/weapon/spellbook/oneuse/horsemask(get_turf(H))
|
||||
if("charge")
|
||||
new /obj/item/weapon/spellbook/oneuse/charge(get_turf(H))
|
||||
if("summonitem")
|
||||
new /obj/item/weapon/spellbook/oneuse/summonitem(get_turf(H))
|
||||
if("wandnothing")
|
||||
new /obj/item/weapon/gun/magic/wand(get_turf(H))
|
||||
if("wanddeath")
|
||||
@@ -109,10 +137,8 @@
|
||||
H.see_in_dark = 8
|
||||
H.see_invisible = SEE_INVISIBLE_LEVEL_TWO
|
||||
H << "<span class='notice'>The walls suddenly disappear.</span>"
|
||||
|
||||
if("voodoo")
|
||||
new /obj/item/voodoo(get_turf(H))
|
||||
|
||||
if("special")
|
||||
magiclist -= "special" //only one super OP item per summoning max
|
||||
switch (randomizemagicspecial)
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
|
||||
var/spell_type = null
|
||||
var/desc = ""
|
||||
var/category = "Offensive Spells"
|
||||
var/category = "Offensive"
|
||||
var/log_name = "XX" //What it shows up as in logs
|
||||
var/cost = 1
|
||||
var/cost = 2
|
||||
var/refundable = 1
|
||||
var/surplus = -1 // -1 for infinite, not used by anything atm
|
||||
var/obj/effect/proc_holder/spell/S = null //Since spellbooks can be used by only one person anyway we can track the actual spell
|
||||
@@ -99,6 +99,7 @@
|
||||
name = "Remove Clothes Requirement"
|
||||
spell_type = /obj/effect/proc_holder/spell/noclothes
|
||||
log_name = "NC"
|
||||
category = "Defensive"
|
||||
|
||||
/datum/spellbook_entry/fireball
|
||||
name = "Fireball"
|
||||
@@ -109,6 +110,7 @@
|
||||
name = "Magic Missile"
|
||||
spell_type = /obj/effect/proc_holder/spell/targeted/projectile/magic_missile
|
||||
log_name = "MM"
|
||||
category = "Defensive"
|
||||
|
||||
/datum/spellbook_entry/disintegrate
|
||||
name = "Disintegrate"
|
||||
@@ -119,12 +121,14 @@
|
||||
name = "Disable Tech"
|
||||
spell_type = /obj/effect/proc_holder/spell/targeted/emplosion/disable_tech
|
||||
log_name = "DT"
|
||||
category = "Utility Spells"
|
||||
category = "Defensive"
|
||||
cost = 1
|
||||
|
||||
/datum/spellbook_entry/repulse
|
||||
name = "Repulse"
|
||||
spell_type = /obj/effect/proc_holder/spell/aoe_turf/repulse
|
||||
log_name = "RP"
|
||||
category = "Defensive"
|
||||
|
||||
/datum/spellbook_entry/timestop
|
||||
name = "Time Stop"
|
||||
@@ -136,59 +140,57 @@
|
||||
name = "Smoke"
|
||||
spell_type = /obj/effect/proc_holder/spell/targeted/smoke
|
||||
log_name = "SM"
|
||||
category = "Utility Spells"
|
||||
category = "Defensive"
|
||||
cost = 1
|
||||
|
||||
/datum/spellbook_entry/blind
|
||||
name = "Blind"
|
||||
spell_type = /obj/effect/proc_holder/spell/targeted/trigger/blind
|
||||
log_name = "BD"
|
||||
cost = 1
|
||||
|
||||
/datum/spellbook_entry/mindswap
|
||||
name = "Mindswap"
|
||||
spell_type = /obj/effect/proc_holder/spell/targeted/mind_transfer
|
||||
log_name = "MT"
|
||||
category = "Utility Spells"
|
||||
category = "Mobility"
|
||||
|
||||
/datum/spellbook_entry/forcewall
|
||||
name = "Force Wall"
|
||||
spell_type = /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall
|
||||
log_name = "FW"
|
||||
category = "Utility Spells"
|
||||
category = "Defensive"
|
||||
cost = 1
|
||||
|
||||
/datum/spellbook_entry/blink
|
||||
name = "Blink"
|
||||
spell_type = /obj/effect/proc_holder/spell/targeted/turf_teleport/blink
|
||||
log_name = "BL"
|
||||
category = "Utility Spells"
|
||||
category = "Mobility"
|
||||
|
||||
/datum/spellbook_entry/teleport
|
||||
name = "Teleport"
|
||||
spell_type = /obj/effect/proc_holder/spell/targeted/area_teleport/teleport
|
||||
log_name = "TP"
|
||||
category = "Utility Spells"
|
||||
category = "Mobility"
|
||||
|
||||
/datum/spellbook_entry/mutate
|
||||
name = "Mutate"
|
||||
spell_type = /obj/effect/proc_holder/spell/targeted/genetic/mutate
|
||||
log_name = "MU"
|
||||
category = "Utility Spells"
|
||||
|
||||
/datum/spellbook_entry/jaunt
|
||||
name = "Ethereal Jaunt"
|
||||
spell_type = /obj/effect/proc_holder/spell/targeted/ethereal_jaunt
|
||||
log_name = "EJ"
|
||||
category = "Utility Spells"
|
||||
category = "Mobility"
|
||||
|
||||
/datum/spellbook_entry/knock
|
||||
name = "Knock"
|
||||
spell_type = /obj/effect/proc_holder/spell/aoe_turf/knock
|
||||
log_name = "KN"
|
||||
category = "Utility Spells"
|
||||
|
||||
/datum/spellbook_entry/horseman
|
||||
name = "Curse of The Horseman"
|
||||
spell_type = /obj/effect/proc_holder/spell/targeted/horsemask
|
||||
log_name = "HH"
|
||||
category = "Mobility"
|
||||
cost = 1
|
||||
|
||||
/datum/spellbook_entry/fleshtostone
|
||||
name = "Flesh to Stone"
|
||||
@@ -199,20 +201,45 @@
|
||||
name = "Summon Item"
|
||||
spell_type = /obj/effect/proc_holder/spell/targeted/summonitem
|
||||
log_name = "IS"
|
||||
category = "Utility Spells"
|
||||
category = "Assistance"
|
||||
cost = 1
|
||||
|
||||
/datum/spellbook_entry/lichdom
|
||||
name = "Bind Soul"
|
||||
spell_type = /obj/effect/proc_holder/spell/targeted/lichdom
|
||||
log_name = "LD"
|
||||
category = "Defensive"
|
||||
|
||||
/datum/spellbook_entry/lightningbolt
|
||||
name = "Lightning Bolt"
|
||||
spell_type = /obj/effect/proc_holder/spell/targeted/lightning
|
||||
log_name = "LB"
|
||||
|
||||
/datum/spellbook_entry/infinite_guns
|
||||
name = "Lesser Summon Guns"
|
||||
spell_type = /obj/effect/proc_holder/spell/targeted/infinite_guns
|
||||
log_name = "IG"
|
||||
cost = 4
|
||||
|
||||
/datum/spellbook_entry/horseman
|
||||
name = "Curse of The Horseman"
|
||||
spell_type = /obj/effect/proc_holder/spell/targeted/horsemask
|
||||
log_name = "HH"
|
||||
|
||||
/datum/spellbook_entry/charge
|
||||
name = "Charge"
|
||||
spell_type = /obj/effect/proc_holder/spell/targeted/charge
|
||||
log_name = "CH"
|
||||
category = "Assistance"
|
||||
cost = 1
|
||||
|
||||
/datum/spellbook_entry/item
|
||||
name = "Buy Item"
|
||||
category = "Artifacts"
|
||||
refundable = 0
|
||||
buy_word = "Summon"
|
||||
var/item_path= null
|
||||
|
||||
|
||||
/datum/spellbook_entry/item/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book)
|
||||
new item_path(get_turf(user))
|
||||
feedback_add_details("wizard_spell_learned",log_name)
|
||||
@@ -238,6 +265,7 @@
|
||||
desc = "An arcane staff capable of shooting bolts of eldritch energy which cause inanimate objects to come to life. This magic doesn't affect machines."
|
||||
item_path = /obj/item/weapon/gun/magic/staff/animate
|
||||
log_name = "SA"
|
||||
category = "Assistance"
|
||||
|
||||
/datum/spellbook_entry/item/staffchaos
|
||||
name = "Staff of Chaos"
|
||||
@@ -250,26 +278,23 @@
|
||||
desc = "A particular staff that can mold solid metal into ornate wooden doors. Useful for getting around in the absence of other transportation. Does not work on glass."
|
||||
item_path = /obj/item/weapon/gun/magic/staff/door
|
||||
log_name = "SD"
|
||||
cost = 1
|
||||
category = "Mobility"
|
||||
|
||||
/datum/spellbook_entry/item/staffhealing
|
||||
name = "Staff of Healing"
|
||||
desc = "An altruistic staff that can heal the lame and raise the dead."
|
||||
item_path = /obj/item/weapon/gun/magic/staff/healing
|
||||
log_name = "SH"
|
||||
cost = 1
|
||||
category = "Defensive"
|
||||
|
||||
/datum/spellbook_entry/item/scryingorb
|
||||
name = "Scrying Orb"
|
||||
desc = "An incandescent orb of crackling energy, using it will allow you to ghost while alive, allowing you to spy upon the station with ease. In addition, buying it will permanently grant you x-ray vision."
|
||||
item_path = /obj/item/weapon/scrying
|
||||
log_name = "SO"
|
||||
|
||||
/datum/spellbook_entry/item/bloodbottle
|
||||
name = "Bottle of Blood"
|
||||
desc = "A bottle of magically infused blood, the smell of which will attract extradimensional beings when broken. Be careful though, the kinds of creatures summoned by blood magic are indiscriminate in their killing, and you yourself may become a victim."
|
||||
item_path = /obj/item/weapon/antag_spawner/slaughter_demon
|
||||
log_name = "BB"
|
||||
limit = 3
|
||||
|
||||
/datum/spellbook_entry/item/tarotdeck
|
||||
name = "Tarot Deck"
|
||||
desc = "A deck of tarot cards that can be used to summon a spirit companion for the wizard."
|
||||
item_path = /obj/item/weapon/guardiancreator
|
||||
log_name = "TD"
|
||||
limit = 1
|
||||
category = "Defensive"
|
||||
|
||||
/datum/spellbook_entry/item/scryingorb/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book)
|
||||
if(..())
|
||||
@@ -287,6 +312,7 @@
|
||||
desc = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot."
|
||||
item_path = /obj/item/weapon/storage/belt/soulstone/full
|
||||
log_name = "SS"
|
||||
category = "Assistance"
|
||||
|
||||
/datum/spellbook_entry/item/soulstones/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book)
|
||||
. =..()
|
||||
@@ -299,18 +325,21 @@
|
||||
desc = "A Necromantic stone is able to resurrect three dead individuals as skeletal thralls for you to command."
|
||||
item_path = /obj/item/device/necromantic_stone
|
||||
log_name = "NS"
|
||||
category = "Assistance"
|
||||
|
||||
/datum/spellbook_entry/item/wands
|
||||
name = "Wand Assortment"
|
||||
desc = "A collection of wands that allow for a wide variety of utility. Wands do not recharge, so be conservative in use. Comes in a handy belt."
|
||||
item_path = /obj/item/weapon/storage/belt/wands/full
|
||||
log_name = "WA"
|
||||
category = "Defensive"
|
||||
|
||||
/datum/spellbook_entry/item/armor
|
||||
name = "Mastercrafted Armor Set"
|
||||
desc = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space."
|
||||
item_path = /obj/item/clothing/suit/space/rig/wizard
|
||||
log_name = "HS"
|
||||
category = "Defensive"
|
||||
|
||||
/datum/spellbook_entry/item/armor/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book)
|
||||
. = ..()
|
||||
@@ -324,6 +353,35 @@
|
||||
desc = "A magical contract binding an apprentice wizard to your service, using it will summon them to your side."
|
||||
item_path = /obj/item/weapon/contract
|
||||
log_name = "CT"
|
||||
category = "Assistance"
|
||||
|
||||
/datum/spellbook_entry/item/bloodbottle
|
||||
name = "Bottle of Blood"
|
||||
desc = "A bottle of magically infused blood, the smell of which will attract extradimensional beings when broken. Be careful though, the kinds of creatures summoned by blood magic are indiscriminate in their killing, and you yourself may become a victim."
|
||||
item_path = /obj/item/weapon/antag_spawner/slaughter_demon
|
||||
log_name = "BB"
|
||||
limit = 3
|
||||
category = "Assistance"
|
||||
|
||||
/datum/spellbook_entry/item/tarotdeck
|
||||
name = "Tarot Deck"
|
||||
desc = "A deck of tarot cards that can be used to summon a spirit companion for the wizard."
|
||||
item_path = /obj/item/weapon/guardiancreator
|
||||
log_name = "TD"
|
||||
limit = 1
|
||||
category = "Assistance"
|
||||
|
||||
/datum/spellbook_entry/item/mjolnir
|
||||
name = "Mjolnir"
|
||||
desc = "A mighty hammer on loan from Thor, God of Thunder. It crackles with barely contained power."
|
||||
item_path = /obj/item/weapon/twohanded/mjollnir
|
||||
log_name = "MJ"
|
||||
|
||||
/datum/spellbook_entry/item/singularity_hammer
|
||||
name = "Singularity Hammer"
|
||||
desc = "A hammer that creates an intensely powerful field of gravity where it strikes, pulling everthing nearby to the point of impact."
|
||||
item_path = /obj/item/weapon/twohanded/singularityhammer
|
||||
log_name = "SI"
|
||||
|
||||
/datum/spellbook_entry/summon
|
||||
name = "Summon Stuff"
|
||||
@@ -349,11 +407,17 @@
|
||||
|
||||
/datum/spellbook_entry/summon/guns
|
||||
name = "Summon Guns"
|
||||
category = "Challenges"
|
||||
category = "Rituals"
|
||||
desc = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. Just be careful not to stand still too long!"
|
||||
cost = 0
|
||||
log_name = "SG"
|
||||
|
||||
/datum/spellbook_entry/summon/guns/IsAvailible()
|
||||
if(ticker.mode.name == "ragin' mages")
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
|
||||
/datum/spellbook_entry/summon/guns/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book)
|
||||
feedback_add_details("wizard_spell_learned",log_name)
|
||||
user.rightandwrong(0)
|
||||
@@ -369,6 +433,12 @@
|
||||
cost = 0
|
||||
log_name = "SU"
|
||||
|
||||
/datum/spellbook_entry/summon/magic/IsAvailible()
|
||||
if(ticker.mode.name == "ragin' mages")
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
|
||||
/datum/spellbook_entry/summon/magic/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book)
|
||||
feedback_add_details("wizard_spell_learned",log_name)
|
||||
user.rightandwrong(1)
|
||||
@@ -384,8 +454,8 @@
|
||||
icon_state ="book"
|
||||
throw_speed = 2
|
||||
throw_range = 5
|
||||
w_class = 1.0
|
||||
var/uses = 5
|
||||
w_class = 1
|
||||
var/uses = 10
|
||||
var/temp = null
|
||||
var/op = 1
|
||||
var/tab = null
|
||||
@@ -429,17 +499,26 @@
|
||||
/obj/item/weapon/spellbook/proc/GetCategoryHeader(var/category)
|
||||
var/dat = ""
|
||||
switch(category)
|
||||
if("Offensive Spells")
|
||||
dat += "Spells that can be reused endlessly.<BR>"
|
||||
dat += "The number after the spell name is the cooldown time.<BR>"
|
||||
if("Offensive")
|
||||
dat += "Spells and items geared towards debilitating and destroying.<BR><BR>"
|
||||
dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.<BR>"
|
||||
dat += "For spells: the number after the spell name is the cooldown time.<BR>"
|
||||
dat += "You can reduce this number by spending more points on the spell.<BR>"
|
||||
if("Utility Spells")
|
||||
dat += "Spells that can be reused endlessly.<BR>"
|
||||
dat += "The number after the spell name is the cooldown time.<BR>"
|
||||
if("Defensive")
|
||||
dat += "Spells and items geared towards improving your survivabilty or reducing foes ability to attack.<BR><BR>"
|
||||
dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.<BR>"
|
||||
dat += "For spells: the number after the spell name is the cooldown time.<BR>"
|
||||
dat += "You can reduce this number by spending more points on the spell.<BR>"
|
||||
if("Mobility")
|
||||
dat += "Spells and items geared towards improving your ability to move. It is a good idea to take at least one.<BR><BR>"
|
||||
dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.<BR>"
|
||||
dat += "For spells: the number after the spell name is the cooldown time.<BR>"
|
||||
dat += "You can reduce this number by spending more points on the spell.<BR>"
|
||||
if("Assistance")
|
||||
dat += "Spells and items geared towards bringing in outside forces to aid you or improving upon your other items and abilties.<BR><BR>"
|
||||
dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.<BR>"
|
||||
dat += "For spells: the number after the spell name is the cooldown time.<BR>"
|
||||
dat += "You can reduce this number by spending more points on the spell.<BR>"
|
||||
if("Artifacts")
|
||||
dat += "Powerful items imbued with eldritch magics. Summoning one will count towards your maximum number of uses.<BR>"
|
||||
dat += "These items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.<BR>"
|
||||
if("Challenges")
|
||||
dat += "The Wizard Federation typically has hard limits on the potency and number of spells brought to the station based on risk.<BR>"
|
||||
dat += "Arming the station against you will increases the risk, but will grant you one more charge for your spellbook.<BR>"
|
||||
@@ -484,7 +563,7 @@
|
||||
cat_dat[category] = "<hr>"
|
||||
dat += "<li><a [tab==category?"class=selected":""] href='byond://?src=\ref[src];page=[category]'>[category]</a></li>"
|
||||
|
||||
dat += "<li><a><b>Uses remaining : [uses]</b></a></li>"
|
||||
dat += "<li><a><b>Points remaining : [uses]</b></a></li>"
|
||||
dat += "</ul>"
|
||||
|
||||
var/datum/spellbook_entry/E
|
||||
@@ -508,7 +587,7 @@
|
||||
dat += cat_dat[category]
|
||||
dat += "</div>"
|
||||
|
||||
user << browse(wrap(dat), "window=spellbook;size=700x300")
|
||||
user << browse(wrap(dat), "window=spellbook;size=700x500")
|
||||
onclose(user, "spellbook")
|
||||
return
|
||||
|
||||
|
||||
@@ -203,10 +203,6 @@
|
||||
|
||||
|
||||
/datum/game_mode/wizard/check_finished()
|
||||
|
||||
if(config.continous_rounds)
|
||||
return ..()
|
||||
|
||||
var/wizards_alive = 0
|
||||
var/traitors_alive = 0
|
||||
for(var/datum/mind/wizard in wizards)
|
||||
@@ -292,10 +288,12 @@
|
||||
//OTHER PROCS
|
||||
|
||||
//To batch-remove wizard spells. Linked to mind.dm.
|
||||
/mob/proc/spellremove(var/mob/M as mob, var/removeallspells=1)
|
||||
for(var/obj/effect/proc_holder/spell/spell_to_remove in src.spell_list)
|
||||
if (spell_to_remove.name == "Artificer" && !removeallspells) continue
|
||||
/mob/proc/spellremove(mob/M)
|
||||
if(!mind)
|
||||
return
|
||||
for(var/obj/effect/proc_holder/spell/spell_to_remove in src.mind.spell_list)
|
||||
qdel(spell_to_remove)
|
||||
mind.spell_list -= spell_to_remove
|
||||
|
||||
/datum/mind/proc/remove_spell(var/obj/effect/proc_holder/spell/spell) //To remove a specific spell from a mind
|
||||
if(!spell) return
|
||||
|
||||
@@ -135,15 +135,7 @@
|
||||
return ..()
|
||||
|
||||
/datum/game_mode/xenos/check_finished()
|
||||
if(config.continous_rounds)
|
||||
if(result)
|
||||
return ..()
|
||||
if(shuttle_master && shuttle_master.emergency.mode >= SHUTTLE_ESCAPE)
|
||||
return ..()
|
||||
if(result || station_was_nuked)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
return result != 0
|
||||
|
||||
/datum/game_mode/xenos/proc/xenos_alive()
|
||||
var/list/livingxenos = list()
|
||||
|
||||
@@ -116,6 +116,15 @@ var/list/support_positions = list(
|
||||
"Blueshield"
|
||||
)
|
||||
|
||||
var/list/supply_positions = list(
|
||||
"Head of Personnel",
|
||||
"Quartermaster",
|
||||
"Cargo Technician",
|
||||
"Shaft Miner"
|
||||
)
|
||||
|
||||
var/list/service_positions = support_positions - supply_positions + list("Head of Personnel")
|
||||
|
||||
|
||||
var/list/security_positions = list(
|
||||
"Head of Security",
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
dat += "<A href='?src=\ref[src];snowfield=1'>((Snow Field)</font>)</A><BR>"
|
||||
dat += "<A href='?src=\ref[src];theatre=1'>((Theatre)</font>)</A><BR>"
|
||||
dat += "<A href='?src=\ref[src];meetinghall=1'>((Meeting Hall)</font>)</A><BR>"
|
||||
dat += "<A href='?src=\ref[src];knightarena=1'>((Knight Arena)</font>)</A><BR>"
|
||||
// dat += "<A href='?src=\ref[src];turnoff=1'>((Shutdown System)</font>)</A><BR>"
|
||||
|
||||
dat += "Please ensure that only holographic weapons are used in the holodeck if a combat simulation has been loaded.<BR>"
|
||||
@@ -120,6 +121,11 @@
|
||||
if(target)
|
||||
loadProgram(target)
|
||||
|
||||
else if(href_list["knightarena"])
|
||||
target = locate(/area/holodeck/source_knightarena)
|
||||
if(target)
|
||||
loadProgram(target)
|
||||
|
||||
else if(href_list["turnoff"])
|
||||
target = locate(/area/holodeck/source_plating)
|
||||
if(target)
|
||||
@@ -142,7 +148,7 @@
|
||||
emagged = !emagged
|
||||
if(emagged)
|
||||
message_admins("[key_name_admin(usr)] overrode the holodeck's safeties")
|
||||
log_game("[key_name(usr)] overrided the holodeck's safeties")
|
||||
log_game("[key_name(usr)] overrode the holodeck's safeties")
|
||||
else
|
||||
message_admins("[key_name_admin(usr)] restored the holodeck's safeties")
|
||||
log_game("[key_name(usr)] restored the holodeck's safeties")
|
||||
@@ -290,7 +296,7 @@
|
||||
holographic_items = A.copy_contents_to(linkedholodeck , 1)
|
||||
|
||||
if(emagged)
|
||||
for(var/obj/item/weapon/holo/esword/H in linkedholodeck)
|
||||
for(var/obj/item/weapon/holo/H in linkedholodeck)
|
||||
H.damtype = BRUTE
|
||||
|
||||
spawn(30)
|
||||
@@ -407,6 +413,28 @@
|
||||
/obj/item/weapon/holo
|
||||
damtype = STAMINA
|
||||
|
||||
/obj/item/weapon/holo/claymore
|
||||
name = "claymore"
|
||||
desc = "What are you standing around staring at this for? Get to killing!"
|
||||
icon_state = "claymore"
|
||||
item_state = "claymore"
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
force = 40
|
||||
throwforce = 10
|
||||
w_class = 4
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
|
||||
/obj/item/weapon/holo/claymore/blue
|
||||
icon_state = "claymoreblue"
|
||||
item_state = "claymoreblue"
|
||||
|
||||
/obj/item/weapon/holo/claymore/red
|
||||
icon_state = "claymorered"
|
||||
item_state = "claymorered"
|
||||
|
||||
/obj/item/weapon/holo/claymore/IsShield()
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/holo/esword
|
||||
desc = "May the force be within you. Sorta"
|
||||
icon_state = "sword0"
|
||||
|
||||
@@ -437,7 +437,7 @@
|
||||
user << "Under directive 7-10, [station_name()] is quarantined until further notice."
|
||||
return
|
||||
|
||||
if(seclevel2num(get_security_level()) == SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes.
|
||||
if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes.
|
||||
shuttle_master.emergency.request(null, 0.5, null, " Automatic Crew Transfer", 1)
|
||||
else
|
||||
shuttle_master.emergency.request(null, 1, null, " Automatic Crew Transfer", 0)
|
||||
|
||||
@@ -882,8 +882,8 @@ About the new airlock wires panel:
|
||||
src.closeOther.close()
|
||||
return ..()
|
||||
|
||||
/obj/machinery/door/airlock/close(var/forced=0)
|
||||
if(operating || welded || locked)
|
||||
/obj/machinery/door/airlock/close(var/forced=0, var/override = 0)
|
||||
if((operating & !override) || welded || locked)
|
||||
return
|
||||
if(!forced)
|
||||
//despite the name, this wire is for general door control.
|
||||
@@ -918,11 +918,11 @@ About the new airlock wires panel:
|
||||
operating = 1
|
||||
do_animate("closing")
|
||||
src.layer = 3.1
|
||||
sleep(5)
|
||||
if (!override) sleep(5)
|
||||
src.density = 1
|
||||
if(!safe)
|
||||
crush()
|
||||
sleep(5)
|
||||
if(!override) sleep(5)
|
||||
update_icon()
|
||||
if(visible && !glass)
|
||||
set_opacity(1)
|
||||
|
||||
@@ -1042,7 +1042,7 @@
|
||||
/obj/item/clothing/suit/poncho/green = 1, /obj/item/clothing/suit/poncho/red = 1, /obj/item/clothing/accessory/blue = 1, /obj/item/clothing/accessory/red = 1, /obj/item/clothing/accessory/black = 1, /obj/item/clothing/accessory/horrible = 1,
|
||||
/obj/item/clothing/under/maid = 1, /obj/item/clothing/under/janimaid = 1, /obj/item/clothing/under/pants/camo = 1, /obj/item/clothing/mask/bandana = 1, /obj/item/clothing/mask/bandana/black = 1)
|
||||
contraband = list(/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,/obj/item/weapon/gun/magic/wand = 1, /obj/item/clothing/mask/balaclava=1, /obj/item/clothing/mask/horsehead = 2)
|
||||
premium = list(/obj/item/clothing/suit/hgpirate = 1, /obj/item/clothing/head/hgpiratecap = 1, /obj/item/clothing/head/helmet/roman = 1, /obj/item/clothing/head/helmet/roman/legionaire = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1)
|
||||
premium = list(/obj/item/clothing/suit/hgpirate = 1, /obj/item/clothing/head/hgpiratecap = 1, /obj/item/clothing/head/helmet/roman = 1, /obj/item/clothing/head/helmet/roman/legionaire = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1, /obj/item/weapon/shield/riot/roman = 1)
|
||||
refill_canister = /obj/item/weapon/vending_refill/autodrobe
|
||||
|
||||
/obj/machinery/vending/autodrobe/New()
|
||||
|
||||
@@ -18,7 +18,8 @@
|
||||
var/list/eng = new()
|
||||
var/list/med = new()
|
||||
var/list/sci = new()
|
||||
var/list/supp = new()
|
||||
var/list/ser = new()
|
||||
var/list/sup = new()
|
||||
var/list/bot = new()
|
||||
var/list/misc = new()
|
||||
var/list/isactive = new()
|
||||
@@ -67,8 +68,11 @@
|
||||
if(real_rank in science_positions)
|
||||
sci[name] = rank
|
||||
department = 1
|
||||
if(real_rank in support_positions)
|
||||
supp[name] = rank
|
||||
if(real_rank in service_positions)
|
||||
ser[name] = rank
|
||||
department = 1
|
||||
if(real_rank in supply_positions)
|
||||
sup[name] = rank
|
||||
department = 1
|
||||
if(real_rank in nonhuman_positions)
|
||||
bot[name] = rank
|
||||
@@ -100,10 +104,15 @@
|
||||
for(name in sci)
|
||||
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[sci[name]]</td><td>[isactive[name]]</td></tr>"
|
||||
even = !even
|
||||
if(supp.len > 0)
|
||||
dat += "<tr><th colspan=3>Support</th></tr>"
|
||||
for(name in supp)
|
||||
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[supp[name]]</td><td>[isactive[name]]</td></tr>"
|
||||
if(ser.len > 0)
|
||||
dat += "<tr><th colspan=3>Service</th></tr>"
|
||||
for(name in ser)
|
||||
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[ser[name]]</td><td>[isactive[name]]</td></tr>"
|
||||
even = !even
|
||||
if(sup.len > 0)
|
||||
dat += "<tr><th colspan=3>Supply</th></tr>"
|
||||
for(name in sup)
|
||||
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[sup[name]]</td><td>[isactive[name]]</td></tr>"
|
||||
even = !even
|
||||
// in case somebody is insane and added them to the manifest, why not
|
||||
if(bot.len > 0)
|
||||
@@ -142,7 +151,8 @@ var/global/ManifestJSON
|
||||
var/eng[0]
|
||||
var/med[0]
|
||||
var/sci[0]
|
||||
var/supp[0]
|
||||
var/ser[0]
|
||||
var/sup[0]
|
||||
var/bot[0]
|
||||
var/misc[0]
|
||||
for(var/datum/data/record/t in data_core.general)
|
||||
@@ -183,11 +193,17 @@ var/global/ManifestJSON
|
||||
if(depthead && sci.len != 1)
|
||||
sci.Swap(1,sci.len)
|
||||
|
||||
if(real_rank in support_positions)
|
||||
supp[++supp.len] = list("name" = name, "rank" = rank, "active" = isactive)
|
||||
if(real_rank in service_positions)
|
||||
ser[++ser.len] = list("name" = name, "rank" = rank, "active" = isactive)
|
||||
department = 1
|
||||
if(depthead && supp.len != 1)
|
||||
supp.Swap(1,supp.len)
|
||||
if(depthead && ser.len != 1)
|
||||
ser.Swap(1,ser.len)
|
||||
|
||||
if(real_rank in supply_positions)
|
||||
sup[++sup.len] = list("name" = name, "rank" = rank, "active" = isactive)
|
||||
department = 1
|
||||
if(depthead && sup.len != 1)
|
||||
sup.Swap(1,sup.len)
|
||||
|
||||
if(real_rank in nonhuman_positions)
|
||||
bot[++bot.len] = list("name" = name, "rank" = rank, "active" = isactive)
|
||||
@@ -203,7 +219,8 @@ var/global/ManifestJSON
|
||||
"eng" = eng,\
|
||||
"med" = med,\
|
||||
"sci" = sci,\
|
||||
"supp" = supp,\
|
||||
"ser" = ser,\
|
||||
"sup" = sup,\
|
||||
"bot" = bot,\
|
||||
"misc" = misc\
|
||||
)
|
||||
|
||||
@@ -271,7 +271,7 @@
|
||||
singular_name = "glass sheet"
|
||||
icon_state = "sheet-plasmaglass"
|
||||
materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT*2)
|
||||
origin_tech = "materials=3;plasma=2"
|
||||
origin_tech = "materials=3;plasmatech=2"
|
||||
var/created_window = /obj/structure/window/plasmabasic
|
||||
var/full_window = /obj/structure/window/full/plasmabasic
|
||||
|
||||
@@ -360,7 +360,7 @@
|
||||
singular_name = "reinforced plasma glass sheet"
|
||||
icon_state = "sheet-plasmarglass"
|
||||
materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT/2, MAT_GLASS=MINERAL_MATERIAL_AMOUNT*2)
|
||||
origin_tech = "materials=3;plasma=2"
|
||||
origin_tech = "materials=3;plasmatech=2"
|
||||
var/created_window = /obj/structure/window/plasmareinforced
|
||||
var/full_window = /obj/structure/window/full/plasmareinforced
|
||||
|
||||
|
||||
@@ -152,6 +152,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \
|
||||
new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("apiary", /obj/item/apiary, 10, time = 25, one_per_turf = 0, on_floor = 0), \
|
||||
new/datum/stack_recipe("easel", /obj/structure/easel, 3, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("wooden buckler", /obj/item/weapon/shield/riot/buckler, 20, time = 40), \
|
||||
)
|
||||
|
||||
/obj/item/stack/sheet/wood
|
||||
|
||||
@@ -1753,4 +1753,33 @@ obj/item/toy/cards/deck/syndicate/black
|
||||
/obj/item/toy/figure/warden
|
||||
name = "Warden action figure"
|
||||
icon_state = "warden"
|
||||
toysay = "Execute him for breaking in!"
|
||||
toysay = "Execute him for breaking in!"
|
||||
|
||||
//////////////////////////////////////////////////////
|
||||
// Magic 8-Ball / Conch //
|
||||
//////////////////////////////////////////////////////
|
||||
|
||||
/obj/item/toy/eight_ball
|
||||
name = "Magic 8-Ball"
|
||||
desc = "Mystical! Magical! Ages 8+!"
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "eight-ball"
|
||||
var/use_action = "shakes the ball"
|
||||
var/cooldown = 0
|
||||
var/list/possible_answers = list("Definitely", "All signs point to yes.", "Most likely.", "Yes.", "Ask again later.", "Better not tell you now.", "Future Unclear.", "Maybe.", "Doubtful.", "No.", "Don't count on it.", "Never.")
|
||||
|
||||
/obj/item/toy/eight_ball/attack_self(mob/user as mob)
|
||||
if(!cooldown)
|
||||
var/answer = pick(possible_answers)
|
||||
user.visible_message("<span class='notice'>[user] focuses on their question and [use_action]...</span>")
|
||||
user.visible_message("<span class='notice'>\icon[src] The [src] says \"[answer]\"</span>")
|
||||
spawn(30)
|
||||
cooldown = 0
|
||||
return
|
||||
|
||||
/obj/item/toy/eight_ball/conch
|
||||
name = "Magic Conch Shell"
|
||||
desc = "All hail the Magic Conch!"
|
||||
icon_state = "conch"
|
||||
use_action = "pulls the string"
|
||||
possible_answers = list("Yes.", "No.", "Try asking again.", "Nothing.", "I don't think so.", "Neither.", "Maybe someday.")
|
||||
@@ -30,6 +30,14 @@ LIGHTERS ARE IN LIGHTERS.DM
|
||||
var/lastHolder = null
|
||||
var/smoketime = 300
|
||||
var/chem_volume = 30
|
||||
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/mask.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
|
||||
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
|
||||
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi'
|
||||
)
|
||||
|
||||
|
||||
/obj/item/clothing/mask/cigarette/New()
|
||||
..()
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
|
||||
if(ishuman(M)) // Would've done this via species instead of type, but the basic mob doesn't have a species, go figure.
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.species.flags & NO_DNA_RAD)
|
||||
if(H.species.flags & NO_DNA)
|
||||
return 0
|
||||
|
||||
if (!user.IsAdvancedToolUser())
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "riot"
|
||||
slot_flags = SLOT_BACK
|
||||
force = 8
|
||||
force = 10
|
||||
throwforce = 5
|
||||
throw_speed = 2
|
||||
throw_range = 3
|
||||
@@ -35,6 +35,19 @@
|
||||
icon_state = "roman_shield"
|
||||
item_state = "roman_shield"
|
||||
|
||||
/obj/item/weapon/shield/riot/buckler
|
||||
name = "wooden buckler"
|
||||
desc = "A medieval wooden buckler."
|
||||
icon_state = "buckler"
|
||||
item_state = "buckler"
|
||||
materials = list()
|
||||
|
||||
/obj/item/weapon/shield/riot/buckler/IsShield()
|
||||
if(prob(60))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/shield/energy
|
||||
name = "energy combat shield"
|
||||
desc = "A shield capable of stopping most melee attacks. Protects user from almost all energy projectiles. It can be retracted, expanded, and stored anywhere."
|
||||
|
||||
@@ -461,7 +461,7 @@
|
||||
max_fuel = 40
|
||||
w_class = 3.0
|
||||
materials = list(MAT_METAL=70, MAT_GLASS=120)
|
||||
origin_tech = "engineering=4;plasma=3"
|
||||
origin_tech = "engineering=4;plasmatech=3"
|
||||
var/last_gen = 0
|
||||
change_icons = 0
|
||||
can_off_process = 1
|
||||
|
||||
@@ -466,7 +466,7 @@
|
||||
vortex(target,user)
|
||||
|
||||
/obj/item/weapon/twohanded/mjollnir
|
||||
name = "Mjollnir"
|
||||
name = "Mjolnir"
|
||||
desc = "A weapon worthy of a god, able to strike with the force of a lightning bolt. It crackles with barely contained energy."
|
||||
icon_state = "mjollnir0"
|
||||
flags = CONDUCT
|
||||
@@ -474,7 +474,7 @@
|
||||
no_embed = 1
|
||||
force = 5
|
||||
force_unwielded = 5
|
||||
force_wielded = 20
|
||||
force_wielded = 25
|
||||
throwforce = 30
|
||||
throw_range = 7
|
||||
w_class = 5
|
||||
@@ -485,25 +485,30 @@
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread()
|
||||
s.set_up(5, 1, target.loc)
|
||||
s.start()
|
||||
target.take_organ_damage(0,30)
|
||||
target.visible_message("<span class='danger'>[target.name] was shocked by the [src.name]!</span>", \
|
||||
"<span class='userdanger'>You feel a powerful shock course through your body sending you flying!</span>", \
|
||||
"<span class='danger'>You hear a heavy electrical crack.</span>")
|
||||
"<span class='italics'>You hear a heavy electrical crack!</span>")
|
||||
var/atom/throw_target = get_edge_target_turf(target, get_dir(src, get_step_away(target, src)))
|
||||
target.throw_at(throw_target, 200, 4)
|
||||
return
|
||||
|
||||
/obj/item/weapon/twohanded/mjollnir/attack(mob/M as mob, mob/user as mob)
|
||||
..()
|
||||
spawn(0)
|
||||
if(wielded)
|
||||
//if(charged == 5)
|
||||
//charged = 0
|
||||
playsound(src.loc, "sparks", 50, 1)
|
||||
if(istype(M, /mob/living))
|
||||
M.Stun(10)
|
||||
M.Stun(3)
|
||||
shock(M)
|
||||
|
||||
/obj/item/weapon/twohanded/mjollnir/throw_impact(atom/target)
|
||||
. = ..()
|
||||
if(istype(target, /mob/living))
|
||||
var/mob/living/L = target
|
||||
L.Stun(3)
|
||||
shock(L)
|
||||
|
||||
/obj/item/weapon/twohanded/mjollnir/update_icon() //Currently only here to fuck with the on-mob icons.
|
||||
icon_state = "mjollnir[wielded]"
|
||||
return
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
new /obj/item/clothing/glasses/hud/security/sunglasses(src)
|
||||
new /obj/item/weapon/storage/lockbox/loyalty(src)
|
||||
new /obj/item/weapon/storage/box/flashbangs(src)
|
||||
new /obj/item/clothing/mask/gas/sechailer/swat(src)
|
||||
new /obj/item/clothing/mask/gas/sechailer/hos(src)
|
||||
new /obj/item/weapon/shield/riot/tele(src)
|
||||
new /obj/item/weapon/melee/baton/loaded(src)
|
||||
new /obj/item/weapon/storage/belt/security/sec(src)
|
||||
@@ -152,7 +152,7 @@
|
||||
new /obj/item/clothing/under/rank/warden/formal(src)
|
||||
new /obj/item/clothing/under/rank/warden/corp(src)
|
||||
new /obj/item/clothing/glasses/hud/security/sunglasses(src)
|
||||
new /obj/item/clothing/mask/gas/sechailer(src)
|
||||
new /obj/item/clothing/mask/gas/sechailer/warden(src)
|
||||
new /obj/item/taperoll/police(src)
|
||||
new /obj/item/weapon/storage/box/zipties(src)
|
||||
new /obj/item/weapon/storage/box/flashbangs(src)
|
||||
|
||||
+52
-48
@@ -1,5 +1,54 @@
|
||||
/mob/var/suiciding = 0
|
||||
|
||||
/mob/living/carbon/human/proc/do_suicide(damagetype, byitem)
|
||||
var/threshold = (config.health_threshold_crit + config.health_threshold_dead) / 2
|
||||
var/dmgamt = maxHealth - threshold
|
||||
|
||||
var/damage_mod = 1
|
||||
switch(damagetype) //Sorry about the magic numbers.
|
||||
//brute = 1, burn = 2, tox = 4, oxy = 8
|
||||
if(15) //4 damage types
|
||||
damage_mod = 4
|
||||
|
||||
if(6, 11, 13, 14) //3 damage types
|
||||
damage_mod = 3
|
||||
|
||||
if(3, 5, 7, 9, 10, 12) //2 damage types
|
||||
damage_mod = 2
|
||||
|
||||
if(1, 2, 4, 8) //1 damage type
|
||||
damage_mod = 1
|
||||
|
||||
else //This should not happen, but if it does, everything should still work
|
||||
damage_mod = 1
|
||||
|
||||
//Do dmgamt damage divided by the number of damage types applied.
|
||||
if(damagetype & BRUTELOSS)
|
||||
adjustBruteLoss(dmgamt / damage_mod)
|
||||
|
||||
if(damagetype & FIRELOSS)
|
||||
adjustFireLoss(dmgamt / damage_mod)
|
||||
|
||||
if(damagetype & TOXLOSS)
|
||||
adjustToxLoss(dmgamt / damage_mod)
|
||||
|
||||
if(damagetype & OXYLOSS)
|
||||
adjustOxyLoss(dmgamt / damage_mod)
|
||||
|
||||
// Failing that...
|
||||
if(!(damagetype & BRUTELOSS) && !(damagetype & FIRELOSS) && !(damagetype & TOXLOSS) && !(damagetype & OXYLOSS))
|
||||
if(species.flags & NO_BREATHE)
|
||||
// the ultimate fallback
|
||||
take_overall_damage(max(dmgamt - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0), 0)
|
||||
else
|
||||
adjustOxyLoss(max(dmgamt - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
|
||||
|
||||
var/obj/item/organ/external/affected = get_organ("head")
|
||||
if(affected)
|
||||
affected.add_autopsy_data(byitem ? "Suicide by [byitem]" : "Suicide", dmgamt)
|
||||
|
||||
updatehealth()
|
||||
|
||||
/mob/living/carbon/human/verb/suicide()
|
||||
set hidden = 1
|
||||
|
||||
@@ -24,56 +73,11 @@
|
||||
if(held_item)
|
||||
var/damagetype = held_item.suicide_act(src)
|
||||
if(damagetype)
|
||||
var/damage_mod = 1
|
||||
switch(damagetype) //Sorry about the magic numbers.
|
||||
//brute = 1, burn = 2, tox = 4, oxy = 8
|
||||
if(15) //4 damage types
|
||||
damage_mod = 4
|
||||
|
||||
if(6, 11, 13, 14) //3 damage types
|
||||
damage_mod = 3
|
||||
|
||||
if(3, 5, 7, 9, 10, 12) //2 damage types
|
||||
damage_mod = 2
|
||||
|
||||
if(1, 2, 4, 8) //1 damage type
|
||||
damage_mod = 1
|
||||
|
||||
else //This should not happen, but if it does, everything should still work
|
||||
damage_mod = 1
|
||||
|
||||
//Do 175 damage divided by the number of damage types applied.
|
||||
if(damagetype & BRUTELOSS)
|
||||
adjustBruteLoss(175/damage_mod)
|
||||
|
||||
if(damagetype & FIRELOSS)
|
||||
adjustFireLoss(175/damage_mod)
|
||||
|
||||
if(damagetype & TOXLOSS)
|
||||
adjustToxLoss(175/damage_mod)
|
||||
|
||||
if(damagetype & OXYLOSS)
|
||||
adjustOxyLoss(175/damage_mod)
|
||||
|
||||
//If something went wrong, just do normal oxyloss
|
||||
if(!(damagetype | BRUTELOSS) && !(damagetype | FIRELOSS) && !(damagetype | TOXLOSS) && !(damagetype | OXYLOSS))
|
||||
adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
|
||||
|
||||
var/obj/item/organ/external/affected = get_organ("head")
|
||||
affected.add_autopsy_data("Suicide by [held_item]", 175)
|
||||
|
||||
updatehealth()
|
||||
do_suicide(damagetype, held_item)
|
||||
return
|
||||
|
||||
|
||||
viewers(src) << pick("\red <b>[src] is attempting to bite \his tongue off! It looks like \he's trying to commit suicide.</b>", \
|
||||
"\red <b>[src] is jamming \his thumbs into \his eye sockets! It looks like \he's trying to commit suicide.</b>", \
|
||||
"\red <b>[src] is twisting \his own neck! It looks like \he's trying to commit suicide.</b>", \
|
||||
"\red <b>[src] is holding \his breath! It looks like \he's trying to commit suicide.</b>")
|
||||
adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
|
||||
|
||||
var/obj/item/organ/external/affected = get_organ("head")
|
||||
affected.add_autopsy_data("Suicide", 175)
|
||||
viewers(src) << "<span class=danger>[src] [pick(species.suicide_messages)] It looks like they're trying to commit suicide.</span>"
|
||||
do_suicide(0)
|
||||
|
||||
updatehealth()
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
playsound(src.loc, 'sound/items/bubblewrap.ogg', 30, 1, extrarange = -4, falloff = 10)
|
||||
icon_state = "prizeconfetti"
|
||||
src.color = pick(random_color_list)
|
||||
var/prize_inside = pick(/obj/random/carp_plushie, /obj/random/plushie, /obj/random/figure) //will add ticket bundles later
|
||||
var/prize_inside = pick(/obj/random/carp_plushie, /obj/random/plushie, /obj/random/figure, /obj/item/toy/eight_ball) //will add ticket bundles later
|
||||
spawn(10)
|
||||
user.unEquip(src)
|
||||
new prize_inside(user.loc)
|
||||
|
||||
@@ -58,9 +58,12 @@
|
||||
desc = "A Collectable Welding Helmet. Now with 80% less lead! Not for actual welding. Any welding done while wearing this Helmet is done so at the owner's own risk!"
|
||||
icon_state = "welding"
|
||||
item_state = "welding"
|
||||
species_fit = list("Vox")
|
||||
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi'
|
||||
"Vox" = 'icons/mob/species/vox/helmet.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
|
||||
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
|
||||
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/collectable/slime
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
|
||||
/obj/item/clothing/head/cueball
|
||||
name = "cueball helmet"
|
||||
desc = "A large, featureless white orb mean to be worn on your head. How do you even see out of this thing?"
|
||||
desc = "A large, featureless white orb meant to be worn on your head. How do you even see out of this thing?"
|
||||
icon_state = "cueball"
|
||||
flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR
|
||||
item_state="cueball"
|
||||
@@ -99,7 +99,7 @@
|
||||
|
||||
/obj/item/clothing/head/justice
|
||||
name = "justice hat"
|
||||
desc = "fight for what's righteous!"
|
||||
desc = "Fight for what's righteous!"
|
||||
icon_state = "justicered"
|
||||
item_state = "justicered"
|
||||
flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR
|
||||
@@ -122,7 +122,7 @@
|
||||
|
||||
/obj/item/clothing/head/rabbitears
|
||||
name = "rabbit ears"
|
||||
desc = "Wearing these makes you looks useless, and only good for your sex appeal."
|
||||
desc = "Wearing these makes you look useless, and only good for your sex appeal."
|
||||
icon_state = "bunny"
|
||||
|
||||
/obj/item/clothing/head/flatcap
|
||||
|
||||
@@ -24,9 +24,12 @@
|
||||
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
flags_inv = (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE)
|
||||
action_button_name = "flip welding helmet"
|
||||
species_fit = list("Vox")
|
||||
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/head.dmi'
|
||||
"Vox" = 'icons/mob/species/vox/head.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/helmet.dmi',
|
||||
"Tajaran" = 'icons/mob/species/tajaran/helmet.dmi',
|
||||
"Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/welding/flamedecal
|
||||
|
||||
@@ -8,9 +8,12 @@
|
||||
w_class = 2
|
||||
action_button_name = "Adjust Balaclava"
|
||||
ignore_maskadjust = 0
|
||||
species_fit = list("Vox")
|
||||
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/mask.dmi'
|
||||
"Vox" = 'icons/mob/species/vox/mask.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
|
||||
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
|
||||
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/mask/balaclava/attack_self(var/mob/user)
|
||||
@@ -24,9 +27,12 @@
|
||||
flags = BLOCKHAIR
|
||||
flags_inv = HIDEFACE
|
||||
w_class = 2
|
||||
species_fit = list("Vox")
|
||||
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/mask.dmi'
|
||||
"Vox" = 'icons/mob/species/vox/mask.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
|
||||
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
|
||||
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/mask/luchador/tecnicos
|
||||
@@ -34,11 +40,9 @@
|
||||
desc = "Worn by robust fighters who uphold justice and fight honorably."
|
||||
icon_state = "luchador"
|
||||
item_state = "luchador"
|
||||
species_fit = list("Vox")
|
||||
|
||||
/obj/item/clothing/mask/luchador/rudos
|
||||
name = "Rudos Mask"
|
||||
desc = "Worn by robust fighters who are willing to do anything to win."
|
||||
icon_state = "luchar"
|
||||
item_state = "luchar"
|
||||
species_fit = list("Vox")
|
||||
item_state = "luchar"
|
||||
@@ -7,13 +7,15 @@
|
||||
w_class = 2
|
||||
gas_transfer_coefficient = 0.10
|
||||
permeability_coefficient = 0.50
|
||||
species_fit = list("Vox")
|
||||
action_button_name = "Adjust Breath Mask"
|
||||
ignore_maskadjust = 0
|
||||
species_fit = list("Vox", "Vox Armalis")
|
||||
species_fit = list("Vox", "Vox Armalis", "Unathi", "Tajaran", "Vulpkanin")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/mask.dmi',
|
||||
"Vox Armalis" = 'icons/mob/species/armalis/mask.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
|
||||
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
|
||||
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/mask/breath/attack_self(var/mob/user)
|
||||
@@ -26,7 +28,7 @@
|
||||
item_state = "medical"
|
||||
permeability_coefficient = 0.01
|
||||
put_on_delay = 10
|
||||
species_fit = list("Vox")
|
||||
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
|
||||
|
||||
/obj/item/clothing/mask/breath/vox
|
||||
desc = "A weirdly-shaped breath mask."
|
||||
|
||||
@@ -8,9 +8,12 @@
|
||||
item_state = "gas_alt"
|
||||
gas_transfer_coefficient = 0.01
|
||||
permeability_coefficient = 0.01
|
||||
species_fit = list("Vox")
|
||||
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/mask.dmi'
|
||||
"Vox" = 'icons/mob/species/vox/mask.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
|
||||
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
|
||||
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi'
|
||||
)
|
||||
|
||||
// **** Welding gas mask ****
|
||||
@@ -25,7 +28,6 @@
|
||||
flash_protect = 2
|
||||
tint = 2
|
||||
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
species_fit = list("Vox")
|
||||
origin_tech = "materials=2;engineering=2"
|
||||
action_button_name = "Toggle Welding Helmet"
|
||||
|
||||
@@ -77,27 +79,23 @@
|
||||
icon_state = "plaguedoctor"
|
||||
item_state = "gas_mask"
|
||||
armor = list(melee = 0, bullet = 0, laser = 2,energy = 2, bomb = 0, bio = 75, rad = 0)
|
||||
species_fit = list("Vox")
|
||||
|
||||
/obj/item/clothing/mask/gas/swat
|
||||
name = "\improper SWAT mask"
|
||||
desc = "A close-fitting tactical mask that can be connected to an air supply."
|
||||
icon_state = "swat"
|
||||
species_fit = list("Vox")
|
||||
|
||||
/obj/item/clothing/mask/gas/syndicate
|
||||
name = "syndicate mask"
|
||||
desc = "A close-fitting tactical mask that can be connected to an air supply."
|
||||
icon_state = "swat"
|
||||
strip_delay = 60
|
||||
species_fit = list("Vox")
|
||||
|
||||
/obj/item/clothing/mask/gas/clown_hat
|
||||
name = "clown wig and mask"
|
||||
desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask."
|
||||
icon_state = "clown"
|
||||
item_state = "clown_hat"
|
||||
species_fit = list("Vox")
|
||||
flags = MASKCOVERSMOUTH | MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | BLOCKHAIR
|
||||
|
||||
/obj/item/clothing/mask/gas/clown_hat/attack_self(mob/user)
|
||||
@@ -128,53 +126,45 @@
|
||||
desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask."
|
||||
icon_state = "clown"
|
||||
item_state = "clown_hat"
|
||||
species_fit = list("Vox")
|
||||
|
||||
/obj/item/clothing/mask/gas/sexyclown
|
||||
name = "sexy-clown wig and mask"
|
||||
desc = "A feminine clown mask for the dabbling crossdressers or female entertainers."
|
||||
icon_state = "sexyclown"
|
||||
item_state = "sexyclown"
|
||||
species_fit = list("Vox")
|
||||
|
||||
/obj/item/clothing/mask/gas/mime
|
||||
name = "mime mask"
|
||||
desc = "The traditional mime's mask. It has an eerie facial posture."
|
||||
icon_state = "mime"
|
||||
item_state = "mime"
|
||||
species_fit = list("Vox")
|
||||
|
||||
/obj/item/clothing/mask/gas/monkeymask
|
||||
name = "monkey mask"
|
||||
desc = "A mask used when acting as a monkey."
|
||||
icon_state = "monkeymask"
|
||||
item_state = "monkeymask"
|
||||
species_fit = list("Vox")
|
||||
|
||||
/obj/item/clothing/mask/gas/sexymime
|
||||
name = "sexy mime mask"
|
||||
desc = "A traditional female mime's mask."
|
||||
icon_state = "sexymime"
|
||||
item_state = "sexymime"
|
||||
species_fit = list("Vox")
|
||||
|
||||
/obj/item/clothing/mask/gas/death_commando
|
||||
name = "Death Commando Mask"
|
||||
icon_state = "death_commando_mask"
|
||||
item_state = "death_commando_mask"
|
||||
species_fit = list("Vox")
|
||||
|
||||
/obj/item/clothing/mask/gas/cyborg
|
||||
name = "cyborg visor"
|
||||
desc = "Beep boop"
|
||||
icon_state = "death"
|
||||
species_fit = list("Vox")
|
||||
|
||||
/obj/item/clothing/mask/gas/owl_mask
|
||||
name = "owl mask"
|
||||
desc = "Twoooo!"
|
||||
icon_state = "owl"
|
||||
species_fit = list("Vox")
|
||||
flags = MASKCOVERSMOUTH | MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | NODROP
|
||||
var/cooldown = 0
|
||||
action_button_name = "Hoot"
|
||||
@@ -207,10 +197,23 @@
|
||||
var/aggressiveness = 2
|
||||
var/safety = 1
|
||||
ignore_maskadjust = 0
|
||||
species_fit = list()
|
||||
species_fit = list("Vox")
|
||||
action_button_name = "HALT!"
|
||||
|
||||
/obj/item/clothing/mask/gas/sechailer/hos
|
||||
name = "\improper HOS SWAT mask"
|
||||
desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000. It has a tan stripe."
|
||||
icon_state = "hosmask"
|
||||
aggressiveness = 3
|
||||
ignore_maskadjust = 1
|
||||
|
||||
/obj/item/clothing/mask/gas/sechailer/warden
|
||||
name = "\improper Warden SWAT mask"
|
||||
desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000. It has a blue stripe."
|
||||
icon_state = "wardenmask"
|
||||
aggressiveness = 3
|
||||
ignore_maskadjust = 1
|
||||
|
||||
|
||||
/obj/item/clothing/mask/gas/sechailer/swat
|
||||
name = "\improper SWAT mask"
|
||||
desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000."
|
||||
|
||||
@@ -36,11 +36,15 @@
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 25, rad = 0)
|
||||
action_button_name = "Adjust Sterile Mask"
|
||||
ignore_maskadjust = 0
|
||||
species_fit = list("Vox")
|
||||
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/mask.dmi'
|
||||
"Vox" = 'icons/mob/species/vox/mask.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
|
||||
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
|
||||
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi'
|
||||
)
|
||||
|
||||
|
||||
/obj/item/clothing/mask/surgical/attack_self(var/mob/user)
|
||||
adjustmask(user)
|
||||
|
||||
@@ -49,9 +53,12 @@
|
||||
desc = "moustache is totally real."
|
||||
icon_state = "fake-moustache"
|
||||
flags_inv = HIDEFACE
|
||||
species_fit = list("Vox")
|
||||
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/mask.dmi'
|
||||
"Vox" = 'icons/mob/species/vox/mask.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
|
||||
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
|
||||
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/mask/fakemoustache/verb/pontificate()
|
||||
@@ -175,9 +182,12 @@
|
||||
ignore_maskadjust = 0
|
||||
adjusted_flags = SLOT_HEAD
|
||||
icon_state = "bandbotany"
|
||||
species_fit = list("Vox")
|
||||
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/mask.dmi'
|
||||
"Vox" = 'icons/mob/species/vox/mask.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
|
||||
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
|
||||
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi'
|
||||
)
|
||||
action_button_name = "Adjust Bandana"
|
||||
|
||||
@@ -187,37 +197,30 @@
|
||||
obj/item/clothing/mask/bandana/red
|
||||
name = "red bandana"
|
||||
icon_state = "bandred"
|
||||
species_fit = list("Vox")
|
||||
|
||||
obj/item/clothing/mask/bandana/blue
|
||||
name = "blue bandana"
|
||||
icon_state = "bandblue"
|
||||
species_fit = list("Vox")
|
||||
|
||||
obj/item/clothing/mask/bandana/gold
|
||||
name = "gold bandana"
|
||||
icon_state = "bandgold"
|
||||
species_fit = list("Vox")
|
||||
|
||||
obj/item/clothing/mask/bandana/green
|
||||
name = "green bandana"
|
||||
icon_state = "bandgreen"
|
||||
species_fit = list("Vox")
|
||||
|
||||
/obj/item/clothing/mask/bandana/botany
|
||||
name = "botany bandana"
|
||||
desc = "It's a green bandana with some fine nanotech lining."
|
||||
icon_state = "bandbotany"
|
||||
species_fit = list("Vox")
|
||||
|
||||
/obj/item/clothing/mask/bandana/skull
|
||||
name = "skull bandana"
|
||||
desc = "It's a black bandana with a skull pattern."
|
||||
icon_state = "bandskull"
|
||||
species_fit = list("Vox")
|
||||
|
||||
/obj/item/clothing/mask/bandana/black
|
||||
name = "black bandana"
|
||||
desc = "It's a black bandana."
|
||||
icon_state = "bandblack"
|
||||
species_fit = list("Vox")
|
||||
icon_state = "bandblack"
|
||||
@@ -1,5 +1,5 @@
|
||||
// PLASMEN SHIT
|
||||
// CAN'T WEAR UNLESS YOU'RE A PINK SKELLINGTON
|
||||
// CAN'T WEAR UNLESS YOU'RE A PINK SKELETON
|
||||
/obj/item/clothing/suit/space/eva/plasmaman
|
||||
name = "plasmaman suit"
|
||||
desc = "A special containment suit designed to protect a plasmaman's volatile body from outside exposure and quickly extinguish it in emergencies."
|
||||
|
||||
@@ -57,13 +57,6 @@
|
||||
else
|
||||
integrated_ai.get_rig_stats = 0
|
||||
|
||||
/mob/living/Stat()
|
||||
. = ..()
|
||||
if(. && get_rig_stats)
|
||||
var/obj/item/weapon/rig/rig = get_rig()
|
||||
if(rig)
|
||||
SetupStat(rig)
|
||||
|
||||
/obj/item/rig_module/ai_container/proc/update_verb_holder()
|
||||
if(!verb_holder)
|
||||
verb_holder = new(src)
|
||||
|
||||
@@ -225,13 +225,6 @@
|
||||
/obj/item/rig_module/proc/accepts_item(var/obj/item/input_device)
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/human/Stat()
|
||||
. = ..()
|
||||
|
||||
if(. && istype(back,/obj/item/weapon/rig))
|
||||
var/obj/item/weapon/rig/R = back
|
||||
SetupStat(R)
|
||||
|
||||
/mob/proc/SetupStat(var/obj/item/weapon/rig/R)
|
||||
if(R && (R.flags & NODROP) && R.installed_modules.len && statpanel("Hardsuit Modules"))
|
||||
var/cell_status = R.cell ? "[R.cell.charge]/[R.cell.maxcharge]" : "ERROR"
|
||||
|
||||
@@ -15,6 +15,12 @@
|
||||
desc = "Strange-looking, red, hat-wear that most certainly belongs to a real magic user."
|
||||
icon_state = "redwizard"
|
||||
|
||||
/obj/item/clothing/head/wizard/black
|
||||
name = "black wizard hat"
|
||||
desc = "Strange-looking black hat-wear that most certainly belongs to a real skeleton. Spooky."
|
||||
icon_state = "blackwizard"
|
||||
|
||||
|
||||
/obj/item/clothing/head/wizard/clown
|
||||
name = "purple wizard hat"
|
||||
desc = "Strange-looking purple hat-wear that most certainly belongs to a real magic user."
|
||||
@@ -66,6 +72,12 @@
|
||||
icon_state = "redwizard"
|
||||
item_state = "redwizrobe"
|
||||
|
||||
/obj/item/clothing/suit/wizrobe/black
|
||||
name = "black wizard robe"
|
||||
desc = "An unnerving black gem-lined robe that reeks of death and decay."
|
||||
icon_state = "blackwizard"
|
||||
item_state = "blackwizrobe"
|
||||
|
||||
/obj/item/clothing/suit/wizrobe/clown
|
||||
name = "Clown Robe"
|
||||
desc = "A set of armoured robes that seem to radiate a dark power. That, and bad fashion decisions."
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
/datum/event/mass_hallucination/start()
|
||||
for(var/mob/living/carbon/human/H in living_mob_list)
|
||||
var/armor = H.getarmor(type = "rad")
|
||||
if((H.species.flags & NO_DNA_RAD) || armor >= 75) // Leave DNA-less species/rad armored players completely unaffected
|
||||
if((H.species.flags & RADIMMUNE) || armor >= 75) // Leave radiation-immune species/rad armored players completely unaffected
|
||||
continue
|
||||
H.hallucination += rand(50, 100)
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
for(var/i = 0, i < 10, i++)
|
||||
for(var/mob/living/carbon/human/H in living_mob_list)
|
||||
var/armor = H.getarmor(type = "rad")
|
||||
if((H.species.flags & NO_DNA_RAD) || armor >= 100) // Leave DNA-less species/fully rad armored players completely unaffected
|
||||
if((H.species.flags & RADIMMUNE) || armor >= 100) // Leave radiation-immune species/fully rad armored players completely unaffected
|
||||
continue
|
||||
var/turf/T = get_turf(H)
|
||||
if(!T)
|
||||
|
||||
@@ -145,6 +145,8 @@
|
||||
/datum/seed/proc/do_sting(var/mob/living/carbon/human/target, var/obj/item/fruit, var/target_limb)
|
||||
if(!get_trait(TRAIT_STINGS))
|
||||
return
|
||||
if(!istype(target))
|
||||
return
|
||||
if(!target_limb) //if we weren't given a target_limb, pick a random one to try stinging
|
||||
target_limb = pick("l_foot","r_foot","l_leg","r_leg","l_hand","r_hand","l_arm", "r_arm","head","chest","groin")
|
||||
if(chems && chems.len)
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
/obj/effect/plant/Crossed(var/mob/living/victim)
|
||||
if(!is_mature())
|
||||
return
|
||||
if(!istype(victim))
|
||||
return
|
||||
var/target_limb = pick("r_foot","l_foot","r_leg","l_leg")
|
||||
if(ishuman(victim))
|
||||
var/mob/living/carbon/human/H = victim
|
||||
|
||||
@@ -210,7 +210,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
..()
|
||||
statpanel("Status")
|
||||
if (client.statpanel == "Status")
|
||||
stat(null, "Station Time: [worldtime2text()]")
|
||||
show_stat_station_time()
|
||||
if(ticker)
|
||||
if(ticker.mode)
|
||||
//world << "DEBUG: ticker not null"
|
||||
@@ -218,10 +218,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
//world << "DEBUG: malf mode ticker test"
|
||||
if(ticker.mode:malf_mode_declared)
|
||||
stat(null, "Time left: [max(ticker.mode:AI_win_timeleft/(ticker.mode:apcs/3), 0)]")
|
||||
if(shuttle_master.emergency.mode >= SHUTTLE_RECALL)
|
||||
var/timeleft = shuttle_master.emergency.timeLeft()
|
||||
if(timeleft > 0)
|
||||
stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]")
|
||||
show_stat_emergency_shuttle_eta()
|
||||
|
||||
/mob/dead/observer/verb/reenter_corpse()
|
||||
set category = "Ghost"
|
||||
@@ -237,10 +234,17 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
usr << "<span class='warning'>Another consciousness is in your body...It is resisting you.</span>"
|
||||
return
|
||||
if(mind.current.ajourn && mind.current.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune).
|
||||
var/obj/effect/rune/R = locate() in mind.current.loc //whilst corpse is alive, we can only reenter the body if it's on the rune
|
||||
if(!(R && R.word1 == cultwords["hell"] && R.word2 == cultwords["travel"] && R.word3 == cultwords["self"])) //astral journeying rune
|
||||
var/turf/T = get_turf(mind.current)
|
||||
var/found_astral_rune = 0
|
||||
if(T)
|
||||
for(var/obj/effect/rune/R in T.contents) //whilst corpse is alive, we can only reenter the body if it's on the rune
|
||||
if(R.word1 == cultwords["hell"] && R.word2 == cultwords["travel"] && R.word3 == cultwords["self"]) //astral journeying rune
|
||||
found_astral_rune = 1
|
||||
break
|
||||
if(!found_astral_rune)
|
||||
usr << "<span class='warning'>The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.</span>"
|
||||
return
|
||||
|
||||
mind.current.ajourn=0
|
||||
mind.current.key = key
|
||||
|
||||
|
||||
@@ -182,10 +182,7 @@
|
||||
//if (client.statpanel == "Status")//ORGANS
|
||||
// stat(null, "Plasma Stored: [getPlasma()]/[max_plasma]")
|
||||
|
||||
if(shuttle_master.emergency.mode >= SHUTTLE_RECALL)
|
||||
var/timeleft = shuttle_master.emergency.timeLeft()
|
||||
if(timeleft > 0)
|
||||
stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]")
|
||||
show_stat_emergency_shuttle_eta()
|
||||
|
||||
/mob/living/carbon/alien/Stun(amount)
|
||||
if(status_flags & CANSTUN)
|
||||
|
||||
@@ -83,12 +83,8 @@ I'm using this for Stat to give it a more nifty interface to work with
|
||||
..()
|
||||
if(has_synthetic_assistance())
|
||||
statpanel("Status")
|
||||
stat(null, "Station Time: [worldtime2text()]")
|
||||
|
||||
if(shuttle_master.emergency.mode >= SHUTTLE_RECALL)
|
||||
var/timeleft = shuttle_master.emergency.timeLeft()
|
||||
if(timeleft > 0)
|
||||
stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]")
|
||||
show_stat_station_time()
|
||||
show_stat_emergency_shuttle_eta()
|
||||
|
||||
if(client.statpanel == "Status")
|
||||
//Knowing how well-off your mech is doing is really important as an MMI
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
qdel(guts)
|
||||
for(var/atom/movable/food in stomach_contents)
|
||||
qdel(food)
|
||||
remove_from_all_data_huds()
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/blob_act()
|
||||
|
||||
@@ -32,9 +32,19 @@
|
||||
else //Everyone else fails, skip the emote attempt
|
||||
return
|
||||
if("squish")
|
||||
var/found_slime_bodypart = 0
|
||||
|
||||
if(species.name == "Slime People") //Only Slime People can squish
|
||||
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
|
||||
else //Everyone else fails, skip the emote attempt
|
||||
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
|
||||
found_slime_bodypart = 1
|
||||
else
|
||||
for(var/obj/item/organ/external/L in organs) // if your limbs are squishy you can squish too!
|
||||
if(L.dna.species in list("Slime People"))
|
||||
on_CD = handle_emote_CD()
|
||||
found_slime_bodypart = 1
|
||||
break
|
||||
|
||||
if(!found_slime_bodypart) //Everyone else fails, skip the emote attempt
|
||||
return
|
||||
if("scream", "fart", "flip", "snap")
|
||||
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
|
||||
|
||||
@@ -95,9 +95,9 @@
|
||||
h_style = "Bald"
|
||||
..(new_loc, "Vox Armalis")
|
||||
|
||||
/mob/living/carbon/human/skellington/New(var/new_loc)
|
||||
/mob/living/carbon/human/skeleton/New(var/new_loc)
|
||||
h_style = "Bald"
|
||||
..(new_loc, "Skellington")
|
||||
..(new_loc, "Skeleton")
|
||||
|
||||
/mob/living/carbon/human/kidan/New(var/new_loc)
|
||||
..(new_loc, "Kidan")
|
||||
@@ -252,15 +252,13 @@
|
||||
stat(null, "Intent: [a_intent]")
|
||||
stat(null, "Move Mode: [m_intent]")
|
||||
|
||||
stat(null, "Station Time: [worldtime2text()]")
|
||||
show_stat_station_time()
|
||||
|
||||
if(ticker && ticker.mode && ticker.mode.name == "AI malfunction")
|
||||
if(ticker.mode:malf_mode_declared)
|
||||
stat(null, "Time left: [max(ticker.mode:AI_win_timeleft/(ticker.mode:apcs/3), 0)]")
|
||||
if(shuttle_master.emergency.mode >= SHUTTLE_RECALL)
|
||||
var/timeleft = shuttle_master.emergency.timeLeft()
|
||||
if(timeleft > 0)
|
||||
stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]")
|
||||
|
||||
show_stat_emergency_shuttle_eta()
|
||||
|
||||
if(client.statpanel == "Status")
|
||||
if(locate(/obj/item/device/assembly/health) in src)
|
||||
@@ -384,33 +382,7 @@
|
||||
if(prob(50) && !shielded)
|
||||
Paralyse(10)
|
||||
|
||||
var/update = 0
|
||||
var/weapon_message = "Explosive Blast"
|
||||
for(var/obj/item/organ/external/temp in organs)
|
||||
switch(temp.limb_name)
|
||||
if("head")
|
||||
update |= temp.take_damage(b_loss * 0.2, f_loss * 0.2, used_weapon = weapon_message)
|
||||
if("chest")
|
||||
update |= temp.take_damage(b_loss * 0.4, f_loss * 0.4, used_weapon = weapon_message)
|
||||
if("groin")
|
||||
update |= temp.take_damage(b_loss * 0.1, f_loss * 0.1, used_weapon = weapon_message)
|
||||
if("l_arm")
|
||||
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
|
||||
if("r_arm")
|
||||
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
|
||||
if("l_leg")
|
||||
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
|
||||
if("r_leg")
|
||||
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
|
||||
if("r_foot")
|
||||
update |= temp.take_damage(b_loss * 0.025, f_loss * 0.025, used_weapon = weapon_message)
|
||||
if("l_foot")
|
||||
update |= temp.take_damage(b_loss * 0.025, f_loss * 0.025, used_weapon = weapon_message)
|
||||
if("r_hand")
|
||||
update |= temp.take_damage(b_loss * 0.025, f_loss * 0.025, used_weapon = weapon_message)
|
||||
if("l_hand")
|
||||
update |= temp.take_damage(b_loss * 0.025, f_loss * 0.025, used_weapon = weapon_message)
|
||||
if(update) UpdateDamageIcon()
|
||||
take_overall_damage(b_loss,f_loss, used_weapon = "Explosive Blast")
|
||||
|
||||
..()
|
||||
|
||||
@@ -1504,6 +1476,10 @@
|
||||
|
||||
maxHealth = species.total_health
|
||||
|
||||
toxins_alert = 0
|
||||
oxygen_alert = 0
|
||||
fire_alert = 0
|
||||
|
||||
if(species.language)
|
||||
add_language(species.language)
|
||||
|
||||
|
||||
@@ -142,7 +142,7 @@
|
||||
/mob/living/carbon/human/adjustCloneLoss(var/amount)
|
||||
..()
|
||||
|
||||
if(species.flags & (NO_DNA_RAD))
|
||||
if(species.flags & (NO_DNA))
|
||||
cloneloss = 0
|
||||
return
|
||||
|
||||
|
||||
@@ -17,6 +17,9 @@
|
||||
has_organ = list(
|
||||
"brain" = /obj/item/organ/internal/brain/golem
|
||||
)
|
||||
suicide_messages = list(
|
||||
"is crumbling into dust!",
|
||||
"is smashing their body apart!")
|
||||
|
||||
/datum/species/golem/handle_post_spawn(var/mob/living/carbon/human/H)
|
||||
if(H.mind)
|
||||
|
||||
@@ -20,6 +20,11 @@
|
||||
bodyflags = FEET_NOSLIP
|
||||
dietflags = DIET_OMNI //the mutation process allowed you to now digest all foods regardless of initial race
|
||||
reagent_tag = PROCESS_ORG
|
||||
suicide_messages = list(
|
||||
"is attempting to bite their tongue off!",
|
||||
"is jamming their claws into their eye sockets!",
|
||||
"is twisting their own neck!",
|
||||
"is staring into the closest light source!")
|
||||
|
||||
/datum/species/shadow/handle_death(var/mob/living/carbon/human/H)
|
||||
H.dust()
|
||||
@@ -0,0 +1,38 @@
|
||||
/datum/species/skeleton
|
||||
name = "Skeleton"
|
||||
name_plural = "Skeletons"
|
||||
|
||||
blurb = "Spoopy and scary."
|
||||
|
||||
icobase = 'icons/mob/human_races/r_skeleton.dmi'
|
||||
deform = 'icons/mob/human_races/r_skeleton.dmi'
|
||||
path = /mob/living/carbon/human/skeleton
|
||||
default_language = "Galactic Common"
|
||||
unarmed_type = /datum/unarmed_attack/punch
|
||||
|
||||
blood_color = "#FFFFFF"
|
||||
flesh_color = "#E6E6C6"
|
||||
|
||||
flags = NO_BREATHE | NO_BLOOD | RADIMMUNE
|
||||
virus_immune = 1 //why is this a var and not a flag?
|
||||
dietflags = DIET_OMNI
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
warning_low_pressure = -1
|
||||
hazard_low_pressure = -1
|
||||
hazard_high_pressure = 999999999
|
||||
warning_high_pressure = 999999999
|
||||
|
||||
cold_level_1 = -1
|
||||
cold_level_2 = -1
|
||||
cold_level_3 = -1
|
||||
|
||||
heat_level_1 = 999999999
|
||||
heat_level_2 = 999999999
|
||||
heat_level_3 = 999999999
|
||||
heat_level_3_breathe = 999999999
|
||||
|
||||
suicide_messages = list(
|
||||
"is snapping their own bones!",
|
||||
"is collapsing into a pile!",
|
||||
"is twisting their skull off!")
|
||||
@@ -88,6 +88,11 @@
|
||||
|
||||
//Death vars.
|
||||
var/death_message = "seizes up and falls limp, their eyes dead and lifeless..."
|
||||
var/list/suicide_messages = list(
|
||||
"is attempting to bite their tongue off!",
|
||||
"is jamming their thumbs into their eye sockets!",
|
||||
"is twisting their own neck!",
|
||||
"is holding their breath!")
|
||||
|
||||
// Language/culture vars.
|
||||
var/default_language = "Galactic Common" // Default language is used when 'say' is used without modifiers.
|
||||
|
||||
@@ -55,6 +55,12 @@
|
||||
flesh_color = "#34AF10"
|
||||
reagent_tag = PROCESS_ORG
|
||||
base_color = "#066000"
|
||||
|
||||
suicide_messages = list(
|
||||
"is attempting to bite their tongue off!",
|
||||
"is jamming their claws into their eye sockets!",
|
||||
"is twisting their own neck!",
|
||||
"is holding their breath!")
|
||||
|
||||
/datum/species/unathi/handle_death(var/mob/living/carbon/human/H)
|
||||
H.stop_tail_wagging(1)
|
||||
@@ -100,6 +106,12 @@
|
||||
reagent_tag = PROCESS_ORG
|
||||
flesh_color = "#AFA59E"
|
||||
base_color = "#333333"
|
||||
|
||||
suicide_messages = list(
|
||||
"is attempting to bite their tongue off!",
|
||||
"is jamming their claws into their eye sockets!",
|
||||
"is twisting their own neck!",
|
||||
"is holding their breath!")
|
||||
|
||||
/datum/species/tajaran/handle_death(var/mob/living/carbon/human/H)
|
||||
H.stop_tail_wagging(1)
|
||||
@@ -135,6 +147,12 @@
|
||||
reagent_tag = PROCESS_ORG
|
||||
flesh_color = "#966464"
|
||||
base_color = "#B43214"
|
||||
|
||||
suicide_messages = list(
|
||||
"is attempting to bite their tongue off!",
|
||||
"is jamming their claws into their eye sockets!",
|
||||
"is twisting their own neck!",
|
||||
"is holding their breath!")
|
||||
|
||||
/datum/species/vulpkanin/handle_death(var/mob/living/carbon/human/H)
|
||||
H.stop_tail_wagging(1)
|
||||
@@ -206,6 +224,13 @@
|
||||
flesh_color = "#808D11"
|
||||
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
suicide_messages = list(
|
||||
"is attempting to bite their tongue off!",
|
||||
"is jamming their claws into their eye sockets!",
|
||||
"is twisting their own neck!",
|
||||
"is holding their breath!",
|
||||
"is deeply inhaling oxygen!")
|
||||
|
||||
/datum/species/vox/handle_death(var/mob/living/carbon/human/H)
|
||||
H.stop_tail_wagging(1)
|
||||
@@ -292,6 +317,13 @@
|
||||
"eyes" = /obj/item/organ/internal/eyes,
|
||||
"stack" = /obj/item/organ/internal/stack/vox
|
||||
)
|
||||
|
||||
suicide_messages = list(
|
||||
"is attempting to bite their tongue off!",
|
||||
"is jamming their claws into their eye sockets!",
|
||||
"is twisting their own neck!",
|
||||
"is holding their breath!",
|
||||
"is huffing oxygen!")
|
||||
|
||||
/datum/species/kidan
|
||||
name = "Kidan"
|
||||
@@ -311,6 +343,12 @@
|
||||
dietflags = DIET_HERB
|
||||
blood_color = "#FB9800"
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
suicide_messages = list(
|
||||
"is attempting to bite their antenna off!",
|
||||
"is jamming their claws into their eye sockets!",
|
||||
"is twisting their own neck!",
|
||||
"is holding their breath!")
|
||||
|
||||
/datum/species/slime
|
||||
name = "Slime People"
|
||||
@@ -333,6 +371,10 @@
|
||||
has_organ = list(
|
||||
"brain" = /obj/item/organ/internal/brain/slime
|
||||
)
|
||||
|
||||
suicide_messages = list(
|
||||
"is melting into a puddle!",
|
||||
"is turning a dull, brown color and melting into a puddle!")
|
||||
|
||||
/datum/species/grey
|
||||
name = "Grey"
|
||||
@@ -433,6 +475,10 @@
|
||||
"l_foot" = list("path" = /obj/item/organ/external/diona/foot),
|
||||
"r_foot" = list("path" = /obj/item/organ/external/diona/foot/right)
|
||||
)
|
||||
|
||||
suicide_messages = list(
|
||||
"is losing branches!",
|
||||
"is pulling themselves apart!")
|
||||
|
||||
/datum/species/diona/can_understand(var/mob/other)
|
||||
var/mob/living/simple_animal/diona/D = other
|
||||
@@ -496,7 +542,7 @@
|
||||
|
||||
passive_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment.
|
||||
|
||||
flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA_RAD | NO_POISON
|
||||
flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA | NO_POISON | RADIMMUNE
|
||||
clothing_flags = HAS_SOCKS
|
||||
bodyflags = HAS_SKIN_COLOR
|
||||
dietflags = 0 //IPCs can't eat, so no diet
|
||||
@@ -526,6 +572,12 @@
|
||||
"l_foot" = list("path" = /obj/item/organ/external/foot/ipc),
|
||||
"r_foot" = list("path" = /obj/item/organ/external/foot/right/ipc)
|
||||
)
|
||||
|
||||
suicide_messages = list(
|
||||
"is powering down!",
|
||||
"is smashing their own monitor!",
|
||||
"is twisting their own neck!",
|
||||
"is blocking their ventilation port!")
|
||||
|
||||
/datum/species/machine/handle_death(var/mob/living/carbon/human/H)
|
||||
H.h_style = ""
|
||||
|
||||
@@ -330,6 +330,8 @@ var/global/list/damage_icon_parts = list()
|
||||
stand_icon.Blend(base_icon,ICON_OVERLAY)
|
||||
if(src.species.bodyflags & TAIL_OVERLAPPED) // If the user's species is flagged to have a tail that needs to be overlapped by limbs...
|
||||
overlays_standing[LIMBS_LAYER] = image(stand_icon) // Diverts limbs to their own layer so they can overlay things (i.e. tails).
|
||||
else
|
||||
overlays_standing[LIMBS_LAYER] = null // So we don't get the old species' sprite splatted on top of the new one's
|
||||
|
||||
//Underwear
|
||||
overlays_standing[UNDERWEAR_LAYER] = null
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/apply_effect(var/effect = 0, var/effecttype = STUN, var/blocked = 0, var/negate_armor = 0)
|
||||
if((effecttype == IRRADIATE) && (species.flags & NO_DNA_RAD))
|
||||
if((effecttype == IRRADIATE) && (species.flags & RADIMMUNE))
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -2,6 +2,13 @@
|
||||
/mob/living/Destroy()
|
||||
..()
|
||||
return QDEL_HINT_HARDDEL_NOW
|
||||
|
||||
/mob/living/Stat()
|
||||
. = ..()
|
||||
if(. && get_rig_stats)
|
||||
var/obj/item/weapon/rig/rig = get_rig()
|
||||
if(rig)
|
||||
SetupStat(rig)
|
||||
|
||||
//mob verbs are a lot faster than object verbs
|
||||
//for more info on why this is not atom/pull, see examinate() in mob.dm
|
||||
|
||||
@@ -142,25 +142,11 @@
|
||||
return 0
|
||||
|
||||
|
||||
// this function displays the station time in the status panel
|
||||
/mob/living/silicon/proc/show_station_time()
|
||||
stat(null, "Station Time: [worldtime2text()]")
|
||||
|
||||
|
||||
// this function displays the shuttles ETA in the status panel if the shuttle has been called
|
||||
/mob/living/silicon/proc/show_emergency_shuttle_eta()
|
||||
if(shuttle_master.emergency.mode >= SHUTTLE_RECALL)
|
||||
var/timeleft = shuttle_master.emergency.timeLeft()
|
||||
if(timeleft > 0)
|
||||
stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]")
|
||||
|
||||
|
||||
|
||||
// This adds the basic clock, shuttle recall timer, and malf_ai info to all silicon lifeforms
|
||||
/mob/living/silicon/Stat()
|
||||
if(statpanel("Status"))
|
||||
show_station_time()
|
||||
show_emergency_shuttle_eta()
|
||||
show_stat_station_time()
|
||||
show_stat_emergency_shuttle_eta()
|
||||
show_system_integrity()
|
||||
show_malf_ai()
|
||||
..()
|
||||
|
||||
@@ -258,7 +258,7 @@
|
||||
if(spawnees & 128)
|
||||
C = new(src.loc)
|
||||
C.name = "Drone plasma overcharge counter"
|
||||
C.origin_tech = "plasma=[rand(3,6)]"
|
||||
C.origin_tech = "plasmatech=[rand(3,6)]"
|
||||
|
||||
if(spawnees & 256)
|
||||
C = new(src.loc)
|
||||
|
||||
@@ -990,6 +990,36 @@ var/list/slot_equipment_priority = list( \
|
||||
|
||||
statpanel("Status") // Switch to the Status panel again, for the sake of the lazy Stat procs
|
||||
|
||||
// this function displays the station time in the status panel
|
||||
/mob/proc/show_stat_station_time()
|
||||
stat(null, "Station Time: [worldtime2text()]")
|
||||
|
||||
// this function displays the shuttles ETA in the status panel if the shuttle has been called
|
||||
/mob/proc/show_stat_emergency_shuttle_eta()
|
||||
var/obj/docking_port/mobile/emergency/E = shuttle_master.emergency
|
||||
|
||||
if(E.mode >= SHUTTLE_RECALL)
|
||||
var/message = ""
|
||||
|
||||
var/timeleft = E.timeLeft()
|
||||
message = "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]"
|
||||
|
||||
switch(E.mode)
|
||||
if(SHUTTLE_RECALL, SHUTTLE_ESCAPE)
|
||||
message = "ETR-[message]"
|
||||
if(SHUTTLE_CALL)
|
||||
message = "ETA-[message]"
|
||||
if(SHUTTLE_DOCKED)
|
||||
if(timeleft < 5)
|
||||
message = "Departing..."
|
||||
else
|
||||
message = "ETD-[message]"
|
||||
if(SHUTTLE_STRANDED)
|
||||
message = "ETA-ERR"
|
||||
if(SHUTTLE_ENDGAME)
|
||||
return
|
||||
|
||||
stat(null, message)
|
||||
|
||||
/mob/proc/add_stings_to_statpanel(var/list/stings)
|
||||
for(var/obj/effect/proc_holder/changeling/S in stings)
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
name = "Bald"
|
||||
icon_state = "bald"
|
||||
gender = MALE
|
||||
species_allowed = list("Human","Unathi","Vox","Diona","Kidan","Grey","Plasmaman","Skellington")
|
||||
species_allowed = list("Human","Unathi","Vox","Diona","Kidan","Grey","Plasmaman","Skeleton")
|
||||
|
||||
short
|
||||
name = "Short Hair" // try to capatilize the names please~
|
||||
@@ -1069,7 +1069,7 @@
|
||||
/datum/sprite_accessory/underwear
|
||||
icon = 'icons/mob/underwear.dmi'
|
||||
|
||||
species_allowed = list("Human","Unathi","Vox","Diona","Vulpkanin","Kidan","Grey","Plasmaman","Skellington")
|
||||
species_allowed = list("Human","Unathi","Vox","Diona","Vulpkanin","Kidan","Grey","Plasmaman","Skeleton")
|
||||
|
||||
nude
|
||||
name = "Nude"
|
||||
@@ -1217,7 +1217,7 @@
|
||||
/datum/sprite_accessory/undershirt
|
||||
icon = 'icons/mob/underwear.dmi'
|
||||
|
||||
species_allowed = list("Human","Unathi","Vox","Diona","Vulpkanin","Kidan","Grey","Plasmaman","Skellington")
|
||||
species_allowed = list("Human","Unathi","Vox","Diona","Vulpkanin","Kidan","Grey","Plasmaman","Skeleton")
|
||||
|
||||
/datum/sprite_accessory/undershirt/nude
|
||||
name = "Nude"
|
||||
@@ -1503,13 +1503,13 @@
|
||||
///////////////////////
|
||||
/datum/sprite_accessory/socks
|
||||
icon = 'icons/mob/underwear.dmi'
|
||||
species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington")
|
||||
species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skeleton")
|
||||
|
||||
/datum/sprite_accessory/socks/nude
|
||||
name = "Nude"
|
||||
icon_state = null
|
||||
gender = NEUTER
|
||||
species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington","Vox")
|
||||
species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skeleton","Vox")
|
||||
|
||||
|
||||
/datum/sprite_accessory/socks/white_norm
|
||||
@@ -1681,7 +1681,7 @@
|
||||
|
||||
/datum/sprite_accessory/head_accessory/none
|
||||
name = "None"
|
||||
species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington","Vox")
|
||||
species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skeleton","Vox")
|
||||
icon_state = "accessory_none"
|
||||
|
||||
/datum/sprite_accessory/head_accessory/simple
|
||||
@@ -1773,7 +1773,7 @@
|
||||
|
||||
/datum/sprite_accessory/body_markings/none
|
||||
name = "None"
|
||||
species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington","Vox")
|
||||
species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skeleton","Vox")
|
||||
icon_state = "accessory_none"
|
||||
|
||||
/datum/sprite_accessory/body_markings/stripe
|
||||
|
||||
@@ -30,21 +30,6 @@
|
||||
return STATUS_INTERACTIVE // interactive (green visibility)
|
||||
return STATUS_DISABLED // no updates, completely disabled (red visibility)
|
||||
|
||||
/mob/living/silicon/robot/syndicate/default_can_use_topic(var/src_object)
|
||||
. = ..()
|
||||
if(. != STATUS_INTERACTIVE)
|
||||
return
|
||||
|
||||
if(z in config.admin_levels) // Syndicate borgs can interact with everything on the admin level
|
||||
return STATUS_INTERACTIVE
|
||||
if(istype(get_area(src), /area/syndicate_station)) // If elsewhere, they can interact with everything on the syndicate shuttle
|
||||
return STATUS_INTERACTIVE
|
||||
if(istype(src_object, /obj/machinery)) // Otherwise they can only interact with emagged machinery
|
||||
var/obj/machinery/Machine = src_object
|
||||
if(Machine.emagged)
|
||||
return STATUS_INTERACTIVE
|
||||
return STATUS_UPDATE
|
||||
|
||||
/mob/living/silicon/ai/default_can_use_topic(var/src_object)
|
||||
. = shared_nano_interaction()
|
||||
if(. != STATUS_INTERACTIVE)
|
||||
|
||||
@@ -11,4 +11,11 @@ Contents:
|
||||
desc = "A close-fitting mask that acts both as an air filter and a post-modern fashion statement."
|
||||
icon_state = "s-ninja(norm)"
|
||||
item_state = "s-ninja_mask"
|
||||
unacidable = 1
|
||||
unacidable = 1
|
||||
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/mask.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
|
||||
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
|
||||
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi'
|
||||
)
|
||||
|
||||
@@ -125,6 +125,38 @@
|
||||
..(user)
|
||||
user << "The bolt is [bolt_open ? "open" : "closed"]."
|
||||
|
||||
/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted
|
||||
name = "enchanted bolt action rifle"
|
||||
desc = "Careful not to lose your head."
|
||||
var/guns_left = 30
|
||||
mag_type = "/obj/item/ammo_box/magazine/internal/boltaction/enchanted"
|
||||
|
||||
/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted/New()
|
||||
..()
|
||||
bolt_open = 1
|
||||
pump()
|
||||
|
||||
/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted/dropped()
|
||||
guns_left = 0
|
||||
|
||||
/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted/Fire(atom/target as mob|obj|turf|area, mob/living/carbon/user as mob|obj, params, reflex = 0)
|
||||
..()
|
||||
if(guns_left)
|
||||
var/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted/GUN = new
|
||||
GUN.guns_left = src.guns_left - 1
|
||||
user.drop_item()
|
||||
user.swap_hand()
|
||||
user.put_in_hands(GUN)
|
||||
else
|
||||
user.drop_item()
|
||||
spawn(0)
|
||||
throw_at(pick(oview(7,get_turf(user))),1,1)
|
||||
user.visible_message("<span class='warning'>[user] tosses aside the spent rifle!</span>")
|
||||
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/boltaction/enchanted
|
||||
max_ammo =1
|
||||
|
||||
/////////////////////////////
|
||||
// DOUBLE BARRELED SHOTGUN //
|
||||
/////////////////////////////
|
||||
|
||||
@@ -36,7 +36,8 @@
|
||||
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.species && (H.species.name == "Skrell" || H.species.name =="Neara")) //Skrell and Neara get very drunk very quickly.
|
||||
var/obj/item/organ/liver/L = H.internal_organs_by_name["liver"]
|
||||
if(!L || (istype(L) && L.dna.species in list("Skrell", "Neara")))
|
||||
d*=5
|
||||
|
||||
M.dizziness += dizzy_adj.
|
||||
|
||||
@@ -357,34 +357,4 @@ datum/design/AAC
|
||||
req_tech = list("programming" = 4, "magnets" = 2)
|
||||
build_type = IMPRINTER
|
||||
materials = list(MAT_GLASS = 1000, "sacid" = 20)
|
||||
build_path = /obj/item/weapon/circuitboard/atmos_automation
|
||||
|
||||
|
||||
//Shield Generators//
|
||||
|
||||
/datum/design/shield_gen_ex
|
||||
name = "Circuit Design (Experimental hull shield generator)"
|
||||
desc = "Allows for the construction of circuit boards used to build an experimental hull shield generator."
|
||||
id = "shield_gen_ex"
|
||||
req_tech = list("bluespace" = 4, "plasmatech" = 3)
|
||||
build_type = IMPRINTER
|
||||
materials = list(MAT_GLASS = 2000, "sacid" = 20, MAT_DIAMOND = 10000, MAT_GOLD = 10000)
|
||||
build_path = /obj/item/weapon/circuitboard/shield_gen_ex
|
||||
|
||||
/datum/design/shield_gen
|
||||
name = "Circuit Design (Experimental shield generator)"
|
||||
desc = "Allows for the construction of circuit boards used to build an experimental shield generator."
|
||||
id = "shield_gen"
|
||||
req_tech = list("bluespace" = 4, "plasmatech" = 3)
|
||||
build_type = IMPRINTER
|
||||
materials = list(MAT_GLASS = 2000, "sacid" = 20, MAT_DIAMOND = 10000, MAT_GOLD = 10000)
|
||||
build_path = /obj/item/weapon/circuitboard/shield_gen
|
||||
|
||||
/datum/design/shield_cap
|
||||
name = "Circuit Design (Experimental shield capacitor)"
|
||||
desc = "Allows for the construction of circuit boards used to build an experimental shielding capacitor."
|
||||
id = "shield_cap"
|
||||
req_tech = list("magnets" = 3, "powerstorage" = 4)
|
||||
build_type = IMPRINTER
|
||||
materials = list(MAT_GLASS = 2000, "sacid" = 20, MAT_DIAMOND = 10000, MAT_GOLD = 10000)
|
||||
build_path = /obj/item/weapon/circuitboard/shield_cap
|
||||
build_path = /obj/item/weapon/circuitboard/atmos_automation
|
||||
@@ -1,80 +0,0 @@
|
||||
|
||||
/datum/artifact_effect/forcefield
|
||||
effecttype = "forcefield"
|
||||
var/list/created_field = list()
|
||||
effect_type = 4
|
||||
|
||||
/datum/artifact_effect/forcefield/New()
|
||||
..()
|
||||
trigger = TRIGGER_TOUCH
|
||||
|
||||
/datum/artifact_effect/forcefield/ToggleActivate()
|
||||
..()
|
||||
if(created_field.len)
|
||||
for(var/obj/effect/energy_field/F in created_field)
|
||||
created_field.Remove(F)
|
||||
qdel(F)
|
||||
else if(holder)
|
||||
var/turf/T = get_turf(holder)
|
||||
while(created_field.len < 16)
|
||||
var/obj/effect/energy_field/E = new (locate(T.x,T.y,T.z))
|
||||
created_field.Add(E)
|
||||
E.strength = 1
|
||||
E.density = 1
|
||||
E.anchored = 1
|
||||
E.invisibility = 0
|
||||
spawn(10)
|
||||
UpdateMove()
|
||||
return 1
|
||||
|
||||
/datum/artifact_effect/forcefield/process()
|
||||
..()
|
||||
for(var/obj/effect/energy_field/E in created_field)
|
||||
if(E.strength < 1)
|
||||
E.Strengthen(0.15)
|
||||
else if(E.strength < 5)
|
||||
E.Strengthen(0.25)
|
||||
|
||||
/datum/artifact_effect/forcefield/UpdateMove()
|
||||
if(created_field.len && holder)
|
||||
var/turf/T = get_turf(holder)
|
||||
while(created_field.len < 16)
|
||||
//for now, just instantly respawn the fields when they get destroyed
|
||||
var/obj/effect/energy_field/E = new (locate(T.x,T.y,T))
|
||||
created_field.Add(E)
|
||||
E.anchored = 1
|
||||
E.density = 1
|
||||
E.invisibility = 0
|
||||
|
||||
var/obj/effect/energy_field/E = created_field[1]
|
||||
E.loc = locate(T.x + 2,T.y + 2,T.z)
|
||||
E = created_field[2]
|
||||
E.loc = locate(T.x + 2,T.y + 1,T.z)
|
||||
E = created_field[3]
|
||||
E.loc = locate(T.x + 2,T.y,T.z)
|
||||
E = created_field[4]
|
||||
E.loc = locate(T.x + 2,T.y - 1,T.z)
|
||||
E = created_field[5]
|
||||
E.loc = locate(T.x + 2,T.y - 2,T.z)
|
||||
E = created_field[6]
|
||||
E.loc = locate(T.x + 1,T.y + 2,T.z)
|
||||
E = created_field[7]
|
||||
E.loc = locate(T.x + 1,T.y - 2,T.z)
|
||||
E = created_field[8]
|
||||
E.loc = locate(T.x,T.y + 2,T.z)
|
||||
E = created_field[9]
|
||||
E.loc = locate(T.x,T.y - 2,T.z)
|
||||
E = created_field[10]
|
||||
E.loc = locate(T.x - 1,T.y + 2,T.z)
|
||||
E = created_field[11]
|
||||
E.loc = locate(T.x - 1,T.y - 2,T.z)
|
||||
E = created_field[12]
|
||||
E.loc = locate(T.x - 2,T.y + 2,T.z)
|
||||
E = created_field[13]
|
||||
E.loc = locate(T.x - 2,T.y + 1,T.z)
|
||||
E = created_field[14]
|
||||
E.loc = locate(T.x - 2,T.y,T.z)
|
||||
E = created_field[15]
|
||||
E.loc = locate(T.x - 2,T.y - 1,T.z)
|
||||
E = created_field[16]
|
||||
E.loc = locate(T.x - 2,T.y - 2,T.z)
|
||||
@@ -1,51 +0,0 @@
|
||||
|
||||
////////////////////////////////////////
|
||||
// External Shield Generator
|
||||
|
||||
/obj/item/weapon/circuitboard/shield_gen_ex
|
||||
name = "Circuit board (Experimental hull shield generator)"
|
||||
board_type = "machine"
|
||||
build_path = "/obj/machinery/shield_gen/external"
|
||||
origin_tech = "bluespace=4;plasmatech=3"
|
||||
frame_desc = "Requires 2 Pico Manipulators, 1 Subspace Transmitter, 5 Pieces of cable, 1 Subspace Crystal, 1 Subspace Amplifier and 1 Console Screen."
|
||||
req_components = list(
|
||||
"/obj/item/weapon/stock_parts/manipulator/pico" = 2,
|
||||
"/obj/item/weapon/stock_parts/subspace/transmitter" = 1,
|
||||
"/obj/item/weapon/stock_parts/subspace/crystal" = 1,
|
||||
"/obj/item/weapon/stock_parts/subspace/amplifier" = 1,
|
||||
"/obj/item/weapon/stock_parts/console_screen" = 1,
|
||||
"/obj/item/stack/cable_coil" = 5)
|
||||
|
||||
////////////////////////////////////////
|
||||
// Shield Generator
|
||||
|
||||
/obj/item/weapon/circuitboard/shield_gen
|
||||
name = "Circuit board (Experimental shield generator)"
|
||||
board_type = "machine"
|
||||
build_path = "/obj/machinery/shield_gen/external"
|
||||
origin_tech = "bluespace=4;plasmatech=3"
|
||||
frame_desc = "Requires 2 Pico Manipulators, 1 Subspace Transmitter, 5 Pieces of cable, 1 Subspace Crystal, 1 Subspace Amplifier and 1 Console Screen."
|
||||
req_components = list(
|
||||
"/obj/item/weapon/stock_parts/manipulator/pico" = 2,
|
||||
"/obj/item/weapon/stock_parts/subspace/transmitter" = 1,
|
||||
"/obj/item/weapon/stock_parts/subspace/crystal" = 1,
|
||||
"/obj/item/weapon/stock_parts/subspace/amplifier" = 1,
|
||||
"/obj/item/weapon/stock_parts/console_screen" = 1,
|
||||
"/obj/item/stack/cable_coil" = 5)
|
||||
|
||||
////////////////////////////////////////
|
||||
// Shield Capacitor
|
||||
|
||||
/obj/item/weapon/circuitboard/shield_cap
|
||||
name = "Circuit board (Experimental shield capacitor)"
|
||||
board_type = "machine"
|
||||
build_path = "/obj/machinery/shield_capacitor"
|
||||
origin_tech = "magnets=3;powerstorage=4"
|
||||
frame_desc = "Requires 2 Pico Manipulators, 1 Subspace Filter, 5 Pieces of cable, 1 Subspace Treatment disk, 1 Subspace Analyzer and 1 Console Screen."
|
||||
req_components = list(
|
||||
"/obj/item/weapon/stock_parts/manipulator/pico" = 2,
|
||||
"/obj/item/weapon/stock_parts/subspace/filter" = 1,
|
||||
"/obj/item/weapon/stock_parts/subspace/treatment" = 1,
|
||||
"/obj/item/weapon/stock_parts/subspace/analyzer" = 1,
|
||||
"/obj/item/weapon/stock_parts/console_screen" = 1,
|
||||
"/obj/item/stack/cable_coil" = 5)
|
||||
@@ -1,50 +0,0 @@
|
||||
|
||||
//---------- actual energy field
|
||||
|
||||
/obj/effect/energy_field
|
||||
name = "energy field"
|
||||
desc = "Impenetrable field of energy, capable of blocking anything as long as it's active."
|
||||
icon = 'code/modules/shieldgen/shielding.dmi'
|
||||
icon_state = "shieldsparkles"
|
||||
anchored = 1
|
||||
layer = 4.1 //just above mobs
|
||||
density = 0
|
||||
invisibility = 101
|
||||
var/strength = 0
|
||||
|
||||
/obj/effect/energy_field/ex_act(var/severity)
|
||||
Stress(0.5 + severity)
|
||||
|
||||
/obj/effect/energy_field/bullet_act(var/obj/item/projectile/Proj)
|
||||
Stress(Proj.damage / 10)
|
||||
|
||||
/obj/effect/energy_field/proc/Stress(var/severity)
|
||||
strength -= severity
|
||||
|
||||
//if we take too much damage, drop out - the generator will bring us back up if we have enough power
|
||||
if(strength < 1)
|
||||
invisibility = 101
|
||||
density = 0
|
||||
else if(strength >= 1)
|
||||
invisibility = 0
|
||||
density = 1
|
||||
|
||||
/obj/effect/energy_field/proc/Strengthen(var/severity)
|
||||
strength += severity
|
||||
|
||||
//if we take too much damage, drop out - the generator will bring us back up if we have enough power
|
||||
if(strength >= 1)
|
||||
invisibility = 0
|
||||
density = 1
|
||||
else if(strength < 1)
|
||||
invisibility = 101
|
||||
density = 0
|
||||
|
||||
/obj/effect/energy_field/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0)
|
||||
//Purpose: Determines if the object (or airflow) can pass this atom.
|
||||
//Called by: Movement, airflow.
|
||||
//Inputs: The moving atom (optional), target turf, "height" and air group
|
||||
//Outputs: Boolean if can pass.
|
||||
|
||||
//return (!density || !height || air_group)
|
||||
return !density
|
||||
@@ -1,168 +0,0 @@
|
||||
|
||||
//---------- shield capacitor
|
||||
//pulls energy out of a power net and charges an adjacent generator
|
||||
|
||||
/obj/machinery/shield_capacitor
|
||||
name = "shield capacitor"
|
||||
desc = "Machine that charges a shield generator."
|
||||
icon = 'code/modules/shieldgen/shielding.dmi'
|
||||
icon_state = "capacitor"
|
||||
var/active = 1
|
||||
density = 1
|
||||
anchored = 1
|
||||
var/stored_charge = 0
|
||||
var/time_since_fail = 100
|
||||
var/max_charge = 1000000
|
||||
var/max_charge_rate = 100000
|
||||
var/min_charge_rate = 0
|
||||
var/locked = 0
|
||||
//
|
||||
use_power = 1 //0 use nothing
|
||||
//1 use idle power
|
||||
//2 use active power
|
||||
idle_power_usage = 10
|
||||
active_power_usage = 100
|
||||
var/charge_rate = 100
|
||||
|
||||
/obj/machinery/shield_capacitor/New()
|
||||
spawn(10)
|
||||
for(var/obj/machinery/shield_gen/possible_gen in range(1, src))
|
||||
if(get_dir(src, possible_gen) == src.dir)
|
||||
possible_gen.owned_capacitor = src
|
||||
break
|
||||
..()
|
||||
|
||||
/obj/machinery/shield_capacitor/attackby(obj/item/W, mob/user, params)
|
||||
|
||||
if(istype(W, /obj/item/weapon/card/id))
|
||||
var/obj/item/weapon/card/id/C = W
|
||||
if(access_captain in C.access || access_security in C.access || access_engine in C.access)
|
||||
src.locked = !src.locked
|
||||
user << "Controls are now [src.locked ? "locked." : "unlocked."]"
|
||||
updateDialog()
|
||||
else
|
||||
user << "\red Access denied."
|
||||
else if(istype(W, /obj/item/weapon/card/emag))
|
||||
if(prob(75))
|
||||
src.locked = !src.locked
|
||||
user << "Controls are now [src.locked ? "locked." : "unlocked."]"
|
||||
updateDialog()
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
|
||||
else if(istype(W, /obj/item/weapon/wrench))
|
||||
src.anchored = !src.anchored
|
||||
src.visible_message("\blue \icon[src] [src] has been [anchored ? "bolted to the floor" : "unbolted from the floor"] by [user].")
|
||||
|
||||
spawn(0)
|
||||
for(var/obj/machinery/shield_gen/gen in range(1, src))
|
||||
if(get_dir(src, gen) == src.dir)
|
||||
if(!src.anchored && gen.owned_capacitor == src)
|
||||
gen.owned_capacitor = null
|
||||
break
|
||||
else if(src.anchored && !gen.owned_capacitor)
|
||||
gen.owned_capacitor = src
|
||||
break
|
||||
gen.updateDialog()
|
||||
updateDialog()
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/machinery/shield_capacitor/attack_ai(user as mob)
|
||||
return src.attack_hand(user)
|
||||
|
||||
/obj/machinery/shield_capacitor/attack_hand(mob/user)
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
interact(user)
|
||||
|
||||
/obj/machinery/shield_capacitor/interact(mob/user)
|
||||
if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
|
||||
if (!istype(user, /mob/living/silicon))
|
||||
user.unset_machine()
|
||||
user << browse(null, "window=shield_capacitor")
|
||||
return
|
||||
var/t = "<B>Shield Capacitor Control Console</B><br><br>"
|
||||
if(locked)
|
||||
t += "<i>Swipe your ID card to begin.</i>"
|
||||
else
|
||||
t += "This capacitor is: [active ? "<font color=green>Online</font>" : "<font color=red>Offline</font>" ] <a href='?src=\ref[src];toggle=1'>[active ? "\[Deactivate\]" : "\[Activate\]"]</a><br>"
|
||||
t += "[time_since_fail > 2 ? "<font color=green>Charging stable.</font>" : "<font color=red>Warning, low charge!</font>"]<br>"
|
||||
t += "Charge: [stored_charge] Watts ([100 * stored_charge/max_charge]%)<br>"
|
||||
t += "Charge rate: \
|
||||
<a href='?src=\ref[src];charge_rate=[-max_charge_rate]'>\[min\]</a> \
|
||||
<a href='?src=\ref[src];charge_rate=-1000'>\[--\]</a> \
|
||||
<a href='?src=\ref[src];charge_rate=-100'>\[-\]</a>[charge_rate] Watts/sec \
|
||||
<a href='?src=\ref[src];charge_rate=100'>\[+\]</a> \
|
||||
<a href='?src=\ref[src];charge_rate=1000'>\[++\]</a> \
|
||||
<a href='?src=\ref[src];charge_rate=[max_charge_rate]'>\[max\]</a><br>"
|
||||
t += "<hr>"
|
||||
t += "<A href='?src=\ref[src]'>Refresh</A> "
|
||||
t += "<A href='?src=\ref[src];close=1'>Close</A><BR>"
|
||||
|
||||
user << browse(t, "window=shield_capacitor;size=500x800")
|
||||
user.set_machine(src)
|
||||
|
||||
/obj/machinery/shield_capacitor/process()
|
||||
//
|
||||
if(active)
|
||||
use_power = 2
|
||||
if(stored_charge + charge_rate > max_charge)
|
||||
active_power_usage = max_charge - stored_charge
|
||||
else
|
||||
active_power_usage = charge_rate
|
||||
stored_charge += active_power_usage
|
||||
else
|
||||
use_power = 1
|
||||
|
||||
time_since_fail++
|
||||
if(stored_charge < active_power_usage * 1.5)
|
||||
time_since_fail = 0
|
||||
|
||||
/obj/machinery/shield_capacitor/Topic(href, href_list[])
|
||||
..()
|
||||
if( href_list["close"] )
|
||||
usr << browse(null, "window=shield_capacitor")
|
||||
usr.unset_machine()
|
||||
return
|
||||
if( href_list["toggle"] )
|
||||
active = !active
|
||||
if(active)
|
||||
use_power = 2
|
||||
else
|
||||
use_power = 1
|
||||
if( href_list["charge_rate"] )
|
||||
charge_rate += text2num(href_list["charge_rate"])
|
||||
if(charge_rate > max_charge_rate)
|
||||
charge_rate = max_charge_rate
|
||||
else if(charge_rate < min_charge_rate)
|
||||
charge_rate = min_charge_rate
|
||||
//
|
||||
updateDialog()
|
||||
|
||||
/obj/machinery/shield_capacitor/power_change()
|
||||
if(stat & BROKEN)
|
||||
icon_state = "broke"
|
||||
else
|
||||
if( powered() )
|
||||
if (src.active)
|
||||
icon_state = "capacitor"
|
||||
else
|
||||
icon_state = "capacitor"
|
||||
stat &= ~NOPOWER
|
||||
else
|
||||
spawn(rand(0, 15))
|
||||
src.icon_state = "capacitor"
|
||||
stat |= NOPOWER
|
||||
|
||||
/obj/machinery/shield_capacitor/verb/rotate()
|
||||
set name = "Rotate capacitor clockwise"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
if (src.anchored)
|
||||
usr << "It is fastened to the floor!"
|
||||
return
|
||||
src.dir = turn(src.dir, 270)
|
||||
return
|
||||
@@ -1,280 +0,0 @@
|
||||
//renwicks: fictional unit to describe shield strength
|
||||
//a small meteor hit will deduct 1 renwick of strength from that shield tile
|
||||
//light explosion range will do 1 renwick's damage
|
||||
//medium explosion range will do 2 renwick's damage
|
||||
//heavy explosion range will do 3 renwick's damage
|
||||
//explosion damage is cumulative. if a tile is in range of light, medium and heavy damage, it will take a hit from all three
|
||||
|
||||
/obj/machinery/shield_gen
|
||||
name = "shield generator"
|
||||
desc = "Machine that generates an impenetrable field of energy when activated."
|
||||
icon = 'code/modules/shieldgen/shielding.dmi'
|
||||
icon_state = "generator0"
|
||||
var/active = 0
|
||||
var/field_radius = 3
|
||||
var/list/field
|
||||
density = 1
|
||||
anchored = 1
|
||||
var/locked = 0
|
||||
var/average_field_strength = 0
|
||||
var/strengthen_rate = 0.2
|
||||
var/max_strengthen_rate = 0.2
|
||||
var/powered = 0
|
||||
var/check_powered = 1
|
||||
var/obj/machinery/shield_capacitor/owned_capacitor
|
||||
var/max_field_strength = 10
|
||||
var/time_since_fail = 100
|
||||
var/energy_conversion_rate = 0.01 //how many renwicks per watt?
|
||||
//
|
||||
use_power = 1 //0 use nothing
|
||||
//1 use idle power
|
||||
//2 use active power
|
||||
idle_power_usage = 20
|
||||
active_power_usage = 100
|
||||
|
||||
/obj/machinery/shield_gen/New()
|
||||
spawn(10)
|
||||
for(var/obj/machinery/shield_capacitor/possible_cap in range(1, src))
|
||||
if(get_dir(possible_cap, src) == possible_cap.dir)
|
||||
owned_capacitor = possible_cap
|
||||
break
|
||||
field = new/list()
|
||||
..()
|
||||
|
||||
/obj/machinery/shield_gen/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/weapon/card/id))
|
||||
var/obj/item/weapon/card/id/C = W
|
||||
if(access_captain in C.access || access_security in C.access || access_engine in C.access)
|
||||
src.locked = !src.locked
|
||||
user << "Controls are now [src.locked ? "locked." : "unlocked."]"
|
||||
updateDialog()
|
||||
else
|
||||
user << "\red Access denied."
|
||||
else if(istype(W, /obj/item/weapon/card/emag))
|
||||
if(prob(75))
|
||||
src.locked = !src.locked
|
||||
user << "Controls are now [src.locked ? "locked." : "unlocked."]"
|
||||
updateDialog()
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
|
||||
else if(istype(W, /obj/item/weapon/wrench))
|
||||
src.anchored = !src.anchored
|
||||
src.visible_message("\blue \icon[src] [src] has been [anchored?"bolted to the floor":"unbolted from the floor"] by [user].")
|
||||
|
||||
spawn(0)
|
||||
for(var/obj/machinery/shield_gen/gen in range(1, src))
|
||||
if(get_dir(src, gen) == src.dir)
|
||||
if(!src.anchored && gen.owned_capacitor == src)
|
||||
gen.owned_capacitor = null
|
||||
break
|
||||
else if(src.anchored && !gen.owned_capacitor)
|
||||
gen.owned_capacitor = src
|
||||
break
|
||||
gen.updateDialog()
|
||||
updateDialog()
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/machinery/shield_gen/attack_ai(user as mob)
|
||||
return src.attack_hand(user)
|
||||
|
||||
/obj/machinery/shield_gen/attack_hand(mob/user)
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
interact(user)
|
||||
|
||||
/obj/machinery/shield_gen/interact(mob/user)
|
||||
if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
|
||||
if (!istype(user, /mob/living/silicon))
|
||||
user.unset_machine()
|
||||
user << browse(null, "window=shield_generator")
|
||||
return
|
||||
var/t = "<B>Shield Generator Control Console</B><BR><br>"
|
||||
if(locked)
|
||||
t += "<i>Swipe your ID card to begin.</i>"
|
||||
else
|
||||
t += "[owned_capacitor ? "<font color=green>Charge capacitor connected.</font>" : "<font color=red>Unable to locate charge capacitor!</font>"]<br>"
|
||||
t += "This generator is: [active ? "<font color=green>Online</font>" : "<font color=red>Offline</font>" ] <a href='?src=\ref[src];toggle=1'>[active ? "\[Deactivate\]" : "\[Activate\]"]</a><br>"
|
||||
t += "[time_since_fail > 2 ? "<font color=green>Field is stable.</font>" : "<font color=red>Warning, field is unstable!</font>"]<br>"
|
||||
t += "Coverage radius (restart required): \
|
||||
<a href='?src=\ref[src];change_radius=-5'>--</a> \
|
||||
<a href='?src=\ref[src];change_radius=-1'>-</a> \
|
||||
[field_radius * 2]m \
|
||||
<a href='?src=\ref[src];change_radius=1'>+</a> \
|
||||
<a href='?src=\ref[src];change_radius=5'>++</a><br>"
|
||||
t += "Overall field strength: [average_field_strength] Renwicks ([max_field_strength ? 100 * average_field_strength / max_field_strength : "NA"]%)<br>"
|
||||
t += "Charge rate: <a href='?src=\ref[src];strengthen_rate=-0.1'>--</a> \
|
||||
<a href='?src=\ref[src];strengthen_rate=-0.01'>-</a> \
|
||||
[strengthen_rate] Renwicks/sec \
|
||||
<a href='?src=\ref[src];strengthen_rate=0.01'>+</a> \
|
||||
<a href='?src=\ref[src];strengthen_rate=0.1'>++</a><br>"
|
||||
t += "Upkeep energy: [field.len * average_field_strength / energy_conversion_rate] Watts/sec<br>"
|
||||
t += "Additional energy required to charge: [field.len * strengthen_rate / energy_conversion_rate] Watts/sec<br>"
|
||||
t += "Maximum field strength: \
|
||||
<a href='?src=\ref[src];max_field_strength=-100'>\[min\]</a> \
|
||||
<a href='?src=\ref[src];max_field_strength=-10'>--</a> \
|
||||
<a href='?src=\ref[src];max_field_strength=-1'>-</a> \
|
||||
[max_field_strength] Renwicks \
|
||||
<a href='?src=\ref[src];max_field_strength=1'>+</a> \
|
||||
<a href='?src=\ref[src];max_field_strength=10'>++</a> \
|
||||
<a href='?src=\ref[src];max_field_strength=100'>\[max\]</a><br>"
|
||||
t += "<hr>"
|
||||
t += "<A href='?src=\ref[src]'>Refresh</A> "
|
||||
t += "<A href='?src=\ref[src];close=1'>Close</A><BR>"
|
||||
user << browse(t, "window=shield_generator;size=500x800")
|
||||
user.set_machine(src)
|
||||
|
||||
/obj/machinery/shield_gen/process()
|
||||
|
||||
if(active && field.len)
|
||||
var/stored_renwicks = 0
|
||||
var/target_field_strength = min(strengthen_rate + max(average_field_strength, 0), max_field_strength)
|
||||
if(owned_capacitor)
|
||||
var/required_energy = field.len * target_field_strength / energy_conversion_rate
|
||||
var/assumed_charge = min(owned_capacitor.stored_charge, required_energy)
|
||||
stored_renwicks = assumed_charge * energy_conversion_rate
|
||||
owned_capacitor.stored_charge -= assumed_charge
|
||||
|
||||
time_since_fail++
|
||||
|
||||
average_field_strength = 0
|
||||
target_field_strength = stored_renwicks / field.len
|
||||
|
||||
for(var/obj/effect/energy_field/E in field)
|
||||
if(stored_renwicks)
|
||||
var/strength_change = target_field_strength - E.strength
|
||||
if(strength_change > stored_renwicks)
|
||||
strength_change = stored_renwicks
|
||||
if(E.strength < 0)
|
||||
E.strength = 0
|
||||
else
|
||||
E.Strengthen(strength_change)
|
||||
|
||||
stored_renwicks -= strength_change
|
||||
|
||||
average_field_strength += E.strength
|
||||
else
|
||||
E.Strengthen(-E.strength)
|
||||
|
||||
average_field_strength /= field.len
|
||||
if(average_field_strength < 0)
|
||||
time_since_fail = 0
|
||||
else
|
||||
average_field_strength = 0
|
||||
|
||||
/obj/machinery/shield_gen/Topic(href, href_list[])
|
||||
..()
|
||||
if( href_list["close"] )
|
||||
usr << browse(null, "window=shield_generator")
|
||||
usr.unset_machine()
|
||||
return
|
||||
else if( href_list["toggle"] )
|
||||
toggle()
|
||||
else if( href_list["change_radius"] )
|
||||
field_radius += text2num(href_list["change_radius"])
|
||||
if(field_radius > 200)
|
||||
field_radius = 200
|
||||
else if(field_radius < 0)
|
||||
field_radius = 0
|
||||
else if( href_list["strengthen_rate"] )
|
||||
strengthen_rate += text2num(href_list["strengthen_rate"])
|
||||
if(strengthen_rate > 1)
|
||||
strengthen_rate = 1
|
||||
else if(strengthen_rate < 0)
|
||||
strengthen_rate = 0
|
||||
else if( href_list["max_field_strength"] )
|
||||
max_field_strength += text2num(href_list["max_field_strength"])
|
||||
if(max_field_strength > 1000)
|
||||
max_field_strength = 1000
|
||||
else if(max_field_strength < 0)
|
||||
max_field_strength = 0
|
||||
//
|
||||
updateDialog()
|
||||
|
||||
/obj/machinery/shield_gen/power_change()
|
||||
if(stat & BROKEN)
|
||||
icon_state = "broke"
|
||||
else
|
||||
if( powered() )
|
||||
if (src.active)
|
||||
icon_state = "generator1"
|
||||
else
|
||||
icon_state = "generator0"
|
||||
stat &= ~NOPOWER
|
||||
else
|
||||
spawn(rand(0, 15))
|
||||
src.icon_state = "generator0"
|
||||
stat |= NOPOWER
|
||||
if (src.active)
|
||||
toggle()
|
||||
|
||||
/obj/machinery/shield_gen/ex_act(var/severity)
|
||||
|
||||
if(active)
|
||||
toggle()
|
||||
return ..()
|
||||
|
||||
/*
|
||||
/obj/machinery/shield_gen/proc/check_powered()
|
||||
check_powered = 1
|
||||
if(!anchored)
|
||||
powered = 0
|
||||
return 0
|
||||
var/turf/T = src.loc
|
||||
var/obj/structure/cable/C = T.get_cable_node()
|
||||
var/net
|
||||
if (C)
|
||||
net = C.netnum // find the powernet of the connected cable
|
||||
|
||||
if(!net)
|
||||
powered = 0
|
||||
return 0
|
||||
var/datum/powernet/PN = powernets[net] // find the powernet. Magic code, voodoo code.
|
||||
|
||||
if(!PN)
|
||||
powered = 0
|
||||
return 0
|
||||
var/surplus = max(PN.avail-PN.load, 0)
|
||||
var/shieldload = min(rand(50,200), surplus)
|
||||
if(shieldload==0 && !storedpower) // no cable or no power, and no power stored
|
||||
powered = 0
|
||||
return 0
|
||||
else
|
||||
powered = 1
|
||||
if(PN)
|
||||
storedpower += shieldload
|
||||
PN.load += shieldload //uses powernet power.
|
||||
*/
|
||||
|
||||
/obj/machinery/shield_gen/proc/toggle()
|
||||
active = !active
|
||||
power_change()
|
||||
if(active)
|
||||
var/list/covered_turfs = get_shielded_turfs()
|
||||
var/turf/T = get_turf(src)
|
||||
if(T in covered_turfs)
|
||||
covered_turfs.Remove(T)
|
||||
for(var/turf/O in covered_turfs)
|
||||
var/obj/effect/energy_field/E = new(O)
|
||||
field.Add(E)
|
||||
qdel(covered_turfs)
|
||||
|
||||
for(var/mob/M in view(5,src))
|
||||
M << "\icon[src] You hear heavy droning start up."
|
||||
else
|
||||
for(var/obj/effect/energy_field/D in field)
|
||||
field.Remove(D)
|
||||
qdel(D)
|
||||
|
||||
for(var/mob/M in view(5,src))
|
||||
M << "\icon[src] You hear heavy droning fade out."
|
||||
|
||||
//grab the border tiles in a circle around this machine
|
||||
/obj/machinery/shield_gen/proc/get_shielded_turfs()
|
||||
var/list/out = list()
|
||||
for(var/turf/T in range(field_radius, src))
|
||||
if(get_dist(src,T) == field_radius)
|
||||
out.Add(T)
|
||||
return out
|
||||
@@ -1,42 +0,0 @@
|
||||
|
||||
//---------- external shield generator
|
||||
//generates an energy field that loops around any built up area in space (is useless inside) halts movement and airflow, is blocked by walls, windows, airlocks etc
|
||||
|
||||
/obj/machinery/shield_gen/external/New()
|
||||
..()
|
||||
|
||||
/obj/machinery/shield_gen/external/get_shielded_turfs()
|
||||
var
|
||||
list
|
||||
open = list(get_turf(src))
|
||||
closed = list()
|
||||
|
||||
while(open.len)
|
||||
for(var/turf/T in open)
|
||||
for(var/turf/O in orange(1, T))
|
||||
if(get_dist(O,src) > field_radius)
|
||||
continue
|
||||
var/add_this_turf = 0
|
||||
if(istype(O,/turf/space))
|
||||
for(var/turf/simulated/G in orange(1, O))
|
||||
add_this_turf = 1
|
||||
break
|
||||
|
||||
//uncomment this for structures (but not lattices) to be surrounded by shield as well
|
||||
/*if(!add_this_turf)
|
||||
for(var/obj/structure/S in orange(1, O))
|
||||
if(!istype(S, /obj/structure/lattice))
|
||||
add_this_turf = 1
|
||||
break
|
||||
if(add_this_turf)
|
||||
for(var/obj/structure/S in O)
|
||||
if(!istype(S, /obj/structure/lattice))
|
||||
add_this_turf = 0
|
||||
break*/
|
||||
|
||||
if(add_this_turf && !(O in open) && !(O in closed))
|
||||
open += O
|
||||
open -= T
|
||||
closed += T
|
||||
|
||||
return closed
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 2.4 KiB |
@@ -402,12 +402,14 @@
|
||||
var/obj/machinery/door/Door = O
|
||||
spawn(-1)
|
||||
if(Door)
|
||||
Door.close()
|
||||
if(istype(Door, /obj/machinery/door/airlock))
|
||||
var/obj/machinery/door/airlock/A = Door
|
||||
A.close(0,1)
|
||||
if(A.id_tag == "s_docking_airlock")
|
||||
A.lock()
|
||||
door_unlock_list += A
|
||||
else
|
||||
Door.close()
|
||||
else if (istype(AM,/mob))
|
||||
var/mob/M = AM
|
||||
if(!M.move_on_shuttle)
|
||||
|
||||
@@ -348,14 +348,14 @@
|
||||
E.droplimb(0,DROPLIMB_EDGE)
|
||||
if(3)
|
||||
if(ishuman(mob))
|
||||
if(H.species.name != "Skellington")
|
||||
if(H.species.name != "Skeleton")
|
||||
mob << "<span class = 'warning'> Your necrotic skin ruptures!</span>"
|
||||
for (var/obj/item/organ/external/E in H.organs)
|
||||
if(pick(1,0) && !(E.status & ORGAN_ROBOT))
|
||||
E.createwound(CUT, pick(2,4))
|
||||
if(prob(30))
|
||||
if(H.species.name != "Skellington")
|
||||
if(H.set_species("Skellington"))
|
||||
if(H.species.name != "Skeleton")
|
||||
if(H.set_species("Skeleton"))
|
||||
mob << "<span class = 'warning'> A massive amount of flesh sloughs off your bones!</span>"
|
||||
H.regenerate_icons()
|
||||
else
|
||||
|
||||
@@ -69,8 +69,7 @@ BOMBCAP 20
|
||||
|
||||
### ROUNDSTART SILICON LAWS ###
|
||||
## This controls what the AI's laws are at the start of the round.
|
||||
## Set to 0/commented for "off", silicons will just start with Asimov.
|
||||
## Set to 1 for "custom", silicons will start with the custom laws defined in silicon_laws.txt. (If silicon_laws.txt is empty, the AI will spawn with asimov and Custom boards will auto-delete.)
|
||||
## Set to 2 for "random", silicons will start with a random lawset picked from (at the time of writing): P.A.L.A.D.I.N., Corporate, Asimov. More can be added by changing the law datum paths in ai_laws.dm.
|
||||
## Set to 0/commented for "off", silicons will just start with Crewsimov.
|
||||
## Set to 1 for "random", silicons will start with a random lawset picked from (at the time of writing): Nanotrasen Default, P.A.L.A.D.I.N., Corporate, Robop and Crewsimov. More can be added by changing the law datum "default" variable in ai_laws.dm.
|
||||
|
||||
DEFAULT_LAWS 2
|
||||
DEFAULT_LAWS 1
|
||||
+95
-1
@@ -55,6 +55,100 @@
|
||||
|
||||
-->
|
||||
<div class="commit sansserif">
|
||||
<h2 class="date">31 January 2016</h2>
|
||||
<h3 class="author">Crazylemon64 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Syndicate borgs can now interact with station machinery</li>
|
||||
<li class="rscadd">People with slime people limbs can now *squish</li>
|
||||
<li class="tweak">Skrell's vulnerability to alcohol is checked on their liver, now - a liver transplant will let them take alcohol like a champ - lacking a liver will have the same effect as being a skrell, when drinking</li>
|
||||
</ul>
|
||||
<h3 class="author">FalseIncarnate updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Adds in the Magic Eight Ball toy, found in Claw Game prize orbs.</li>
|
||||
<li class="rscadd">Adds in the Magic Conch Shell, an admin-only shell of power.</li>
|
||||
</ul>
|
||||
<h3 class="author">Fox McCloud updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Updates Summon Guns and Magic to include many of the new guns</li>
|
||||
<li class="tweak">Summon Guns/Magic can no longer be used during Ragin' Mages</li>
|
||||
</ul>
|
||||
<h3 class="author">Tastyfish updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">The emergency shuttle status in the Status tab now has ETA/ETD/etc like before.</li>
|
||||
<li class="tweak">Code Gamma+ now has a 5 minute emergency shuttle call, like Red.</li>
|
||||
</ul>
|
||||
<h3 class="author">pinatacolada updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Adds NanoUI to the operating computer</li>
|
||||
<li class="rscadd">Adds health announcing, critical and oxygen damage aural alerts to the computer, with a menu to selectively turn them on and off</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">29 January 2016</h2>
|
||||
<h3 class="author">Crazylemon updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">The DNA scanner has now undergone a seminar to recognize fake identities; It will now scan the actual person's identity, rather than their disguise (read: wearing a mask with or without someone else's ID).</li>
|
||||
<li class="rscadd">Matter eater now allows you to eat humans as if you were fat.</li>
|
||||
<li class="tweak">Eating mobs with an aggressive grab now generates attack logs.</li>
|
||||
</ul>
|
||||
<h3 class="author">Crazylemon64 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">For a short while, there was a clerical error where all AI communications equipment was replaced with bananas. This has now been fixed.</li>
|
||||
<li class="tweak">Ghosts can now see the contents of smartfridges and look at the drone console</li>
|
||||
<li class="tweak">Humans now only produce one message when shaken while SSD</li>
|
||||
<li class="bugfix">The supermatter no longer will irradiate everyone, everywhere, when it explodes.</li>
|
||||
<li class="tweak">Writing on paper will now add hidden admin fingerprints, so that you can't forge mean notes in someone else's name.</li>
|
||||
<li class="bugfix">Brains are no longer able to escape their brain by being a sorcerer.</li>
|
||||
<li class="bugfix">Astral projecting with other runes on the same tile will now no longer prevent you from re-entering</li>
|
||||
<li class="bugfix">Voxxy that is become ex-voxxy no longer carry voxxy appearance! yaya!</li>
|
||||
</ul>
|
||||
<h3 class="author">FalseIncarnate updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Allows plants to be identified as enhanced*. Enhancing plants results from using reagents (like saltpetre) that affect the stats of a seed instead of using mutagens/machines. *May not meet standards for being classified as "organic produce". (This was already possible, just renames enhanced plants for easier differentiation)</li>
|
||||
</ul>
|
||||
<h3 class="author">Fox McCloud updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Fixes mutadone not working with some genetic mutations</li>
|
||||
<li class="bugfix">Fixes banana honk and silencer being alcoholic</li>
|
||||
<li class="bugfix">Fixes Kahlua being non-alcoholic</li>
|
||||
<li class="bugfix">Fixes polonium not metabolizing</li>
|
||||
<li class="bugfix">Fixes being able to receive free unlimited boxes from the Merchandise store</li>
|
||||
<li class="rscadd">Adds in wooden bucklers</li>
|
||||
<li class="tweak">Re-adds roman shield to the costume vendor</li>
|
||||
<li class="tweak">Buffs Riot shield damage from 8 to 10</li>
|
||||
<li class="rscadd">Adds in a Skeleton race</li>
|
||||
<li class="tweak">Tweaks the skeletons colors to be more realistic and to blend in less with the floor</li>
|
||||
<li class="rscadd">Adds in lichdom spell for the wizard</li>
|
||||
<li class="rscadd">Adds in lesser summon guns spell for wizard</li>
|
||||
<li class="rscadd">adds in Mjolnir and the singularity hammer as weapons the wizard can purchase</li>
|
||||
<li class="rscadd">Wizard can purchase the charge spell from the spell book</li>
|
||||
<li class="rscadd">Wizard can purchase a healing staff from the spell book</li>
|
||||
<li class="tweak">Tweaks and lowers spell costs of utility spells for wizard</li>
|
||||
<li class="tweak">Re-organizes the spellbook to be better divided into categories and have a better window size</li>
|
||||
<li class="tweak">Knock now opens+unlocks lockers</li>
|
||||
<li class="tweak">Magic Missile has a slightly longer cooldown and no longer deals damage, but has a lower cooldown is upgraded</li>
|
||||
</ul>
|
||||
<h3 class="author">KasparoVy updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Navy blue Centcom Officer's beret for use by the Blueshield.</li>
|
||||
<li class="rscadd">Adds the new navy blue beret to the Blueshield's locker.</li>
|
||||
<li class="tweak">Gives the Blueshield's berets (black and navy blue) the exact same strip delay and armour as the Security Officer's beret.</li>
|
||||
<li class="rscadd">Adds TG energy katana back and belt sprite.</li>
|
||||
<li class="rscadd">Bo staff back sprite.</li>
|
||||
<li class="tweak">Adjusts energy katana sprites to make the weapon stand out a bit more from the regular katana.</li>
|
||||
<li class="rscadd">Cutting open the toes of footwear so species with feet-claws can wear them.</li>
|
||||
<li class="rscadd">Toeless jackboots.</li>
|
||||
<li class="tweak">Cleans up glovesnipping and lighting a match with a shoe.</li>
|
||||
<li class="tweak">Lighting a match with a shoe produces a more appropriate message, handled at the same standard as glove-snippingboot-cutting.</li>
|
||||
</ul>
|
||||
<h3 class="author">Tastyfish updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Cargonia now has its own section in the manifest.</li>
|
||||
</ul>
|
||||
<h3 class="author">TheDZD updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscdel">Due to budget cuts and reports of operatives accidentally firing enough bullets to reach a state of what our scientists refer to as "enough dakka," Syndicate High Command has decided to restore the Syndicate Strike Team arsenal to using standard-issue L6 SAW ammunition.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">24 January 2016</h2>
|
||||
<h3 class="author">KasparoVy updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
@@ -87,7 +181,7 @@
|
||||
<li class="tweak">Chaplain's closet is now a secure closet</li>
|
||||
<li class="rscadd">Adds in Assault Gear crate to cargo</li>
|
||||
<li class="rscadd">Adds in military assault belt</li>
|
||||
<li class="rscadd">Adds in spaceworthy swat suits</li>
|
||||
<li class="rcsadd">Adds in spaceworthy swat suits</li>
|
||||
<li class="tweak">tweaks bandolier to hold 2 additional shotgun shells</li>
|
||||
<li class="tweak">bartender starts off with +2 additional shells</li>
|
||||
<li class="tweak">Reduces the cost of the space suit crate and doubles its contents</li>
|
||||
|
||||
@@ -286,3 +286,96 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
|
||||
Tastyfish:
|
||||
- bugfix: Passively power-consuming borg modules, such as the peacekeeper movement
|
||||
and shield module, won't spam the user infinitely if they're low on power anymore.
|
||||
2016-01-29:
|
||||
Crazylemon:
|
||||
- bugfix: 'The DNA scanner has now undergone a seminar to recognize fake identities;
|
||||
It will now scan the actual person''s identity, rather than their disguise (read:
|
||||
wearing a mask with or without someone else''s ID).'
|
||||
- rscadd: Matter eater now allows you to eat humans as if you were fat.
|
||||
- tweak: Eating mobs with an aggressive grab now generates attack logs.
|
||||
Crazylemon64:
|
||||
- bugfix: For a short while, there was a clerical error where all AI communications
|
||||
equipment was replaced with bananas. This has now been fixed.
|
||||
- tweak: Ghosts can now see the contents of smartfridges and look at the drone console
|
||||
- tweak: Humans now only produce one message when shaken while SSD
|
||||
- bugfix: The supermatter no longer will irradiate everyone, everywhere, when it
|
||||
explodes.
|
||||
- tweak: Writing on paper will now add hidden admin fingerprints, so that you can't
|
||||
forge mean notes in someone else's name.
|
||||
- bugfix: Brains are no longer able to escape their brain by being a sorcerer.
|
||||
- bugfix: Astral projecting with other runes on the same tile will now no longer
|
||||
prevent you from re-entering
|
||||
- bugfix: Voxxy that is become ex-voxxy no longer carry voxxy appearance! yaya!
|
||||
FalseIncarnate:
|
||||
- tweak: Allows plants to be identified as enhanced*. Enhancing plants results from
|
||||
using reagents (like saltpetre) that affect the stats of a seed instead of using
|
||||
mutagens/machines. *May not meet standards for being classified as "organic
|
||||
produce". (This was already possible, just renames enhanced plants for easier
|
||||
differentiation)
|
||||
Fox McCloud:
|
||||
- bugfix: Fixes mutadone not working with some genetic mutations
|
||||
- bugfix: Fixes banana honk and silencer being alcoholic
|
||||
- bugfix: Fixes Kahlua being non-alcoholic
|
||||
- bugfix: Fixes polonium not metabolizing
|
||||
- bugfix: Fixes being able to receive free unlimited boxes from the Merchandise
|
||||
store
|
||||
- rscadd: Adds in wooden bucklers
|
||||
- tweak: Re-adds roman shield to the costume vendor
|
||||
- tweak: Buffs Riot shield damage from 8 to 10
|
||||
- rscadd: Adds in a Skeleton race
|
||||
- tweak: Tweaks the skeletons colors to be more realistic and to blend in less with
|
||||
the floor
|
||||
- rscadd: Adds in lichdom spell for the wizard
|
||||
- rscadd: Adds in lesser summon guns spell for wizard
|
||||
- rscadd: adds in Mjolnir and the singularity hammer as weapons the wizard can purchase
|
||||
- rscadd: Wizard can purchase the charge spell from the spell book
|
||||
- rscadd: Wizard can purchase a healing staff from the spell book
|
||||
- tweak: Tweaks and lowers spell costs of utility spells for wizard
|
||||
- tweak: Re-organizes the spellbook to be better divided into categories and have
|
||||
a better window size
|
||||
- tweak: Knock now opens+unlocks lockers
|
||||
- tweak: Magic Missile has a slightly longer cooldown and no longer deals damage,
|
||||
but has a lower cooldown is upgraded
|
||||
KasparoVy:
|
||||
- rscadd: Navy blue Centcom Officer's beret for use by the Blueshield.
|
||||
- rscadd: Adds the new navy blue beret to the Blueshield's locker.
|
||||
- tweak: Gives the Blueshield's berets (black and navy blue) the exact same strip
|
||||
delay and armour as the Security Officer's beret.
|
||||
- rscadd: Adds TG energy katana back and belt sprite.
|
||||
- rscadd: Bo staff back sprite.
|
||||
- tweak: Adjusts energy katana sprites to make the weapon stand out a bit more from
|
||||
the regular katana.
|
||||
- rscadd: Cutting open the toes of footwear so species with feet-claws can wear
|
||||
them.
|
||||
- rscadd: Toeless jackboots.
|
||||
- tweak: Cleans up glovesnipping and lighting a match with a shoe.
|
||||
- tweak: Lighting a match with a shoe produces a more appropriate message, handled
|
||||
at the same standard as glove-snippingboot-cutting.
|
||||
Tastyfish:
|
||||
- rscadd: Cargonia now has its own section in the manifest.
|
||||
TheDZD:
|
||||
- rscdel: Due to budget cuts and reports of operatives accidentally firing enough
|
||||
bullets to reach a state of what our scientists refer to as "enough dakka,"
|
||||
Syndicate High Command has decided to restore the Syndicate Strike Team arsenal
|
||||
to using standard-issue L6 SAW ammunition.
|
||||
2016-01-31:
|
||||
Crazylemon64:
|
||||
- bugfix: Syndicate borgs can now interact with station machinery
|
||||
- rscadd: People with slime people limbs can now *squish
|
||||
- tweak: Skrell's vulnerability to alcohol is checked on their liver, now - a liver
|
||||
transplant will let them take alcohol like a champ - lacking a liver will have
|
||||
the same effect as being a skrell, when drinking
|
||||
FalseIncarnate:
|
||||
- rscadd: Adds in the Magic Eight Ball toy, found in Claw Game prize orbs.
|
||||
- rscadd: Adds in the Magic Conch Shell, an admin-only shell of power.
|
||||
Fox McCloud:
|
||||
- rscadd: Updates Summon Guns and Magic to include many of the new guns
|
||||
- tweak: Summon Guns/Magic can no longer be used during Ragin' Mages
|
||||
Tastyfish:
|
||||
- rscadd: The emergency shuttle status in the Status tab now has ETA/ETD/etc like
|
||||
before.
|
||||
- tweak: Code Gamma+ now has a 5 minute emergency shuttle call, like Red.
|
||||
pinatacolada:
|
||||
- rscadd: Adds NanoUI to the operating computer
|
||||
- rscadd: Adds health announcing, critical and oxygen damage aural alerts to the
|
||||
computer, with a menu to selectively turn them on and off
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
author: TheDZD
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscdel: "Due to budget cuts and reports of operatives accidentally firing enough bullets to reach a state of what our scientists refer to as \"enough dakka,\" Syndicate High Command has decided to restore the Syndicate Strike Team arsenal to using standard-issue L6 SAW ammunition."
|
||||
@@ -1,6 +0,0 @@
|
||||
author: KasparoVy
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscadd: "Navy blue Centcom Officer's beret for use by the Blueshield."
|
||||
- rscadd: "Adds the new navy blue beret to the Blueshield's locker."
|
||||
- tweak: "Gives the Blueshield's berets (black and navy blue) the exact same strip delay and armour as the Security Officer's beret."
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user