Merge branch 'upstream/development' into development

# Conflicts:
#	code/_helpers/time.dm
#	code/game/objects/items/devices/floor_painter.dm
#	code/game/objects/items/stacks/medical.dm
#	code/global.dm
#	code/modules/cargo/randomstock.dm
#	code/modules/mob/living/carbon/human/human_defense.dm
#	code/modules/mob/living/simple_animal/simple_animal.dm
#	code/modules/mob/mob_movement.dm
#	code/modules/paperwork/faxmachine.dm
This commit is contained in:
skull132
2016-12-18 01:06:45 +02:00
37 changed files with 543 additions and 201 deletions
+1 -1
View File
@@ -7,7 +7,7 @@
var/roundstart_hour = 0
//Returns the world time in english
proc/worldtime2text(time = world.time, timeshift = 1)
if(!roundstart_hour) roundstart_hour = pick(2,7,12,17)
if(!roundstart_hour) roundstart_hour = rand(0, 23)
return timeshift ? time2text(time+(36000*roundstart_hour), "hh:mm") : time2text(time, "hh:mm")
proc/worldtime2ticks(time = world.time)
+4 -4
View File
@@ -37,21 +37,21 @@
/datum/controller/process/night_lighting/preStart()
switch (worldtime2ticks())
if (0 to MORNING_LIGHT_RESET)
if (0 to config.nl_finish)
deactivate()
if (NIGHT_LIGHT_ACTIVE to TICKS_IN_DAY)
if (config.nl_start to TICKS_IN_DAY)
activate()
/datum/controller/process/night_lighting/doWork()
switch (worldtime2ticks())
if (0 to MORNING_LIGHT_RESET)
if (0 to config.nl_finish)
if (isactive)
command_announcement.Announce("Good morning. The time is [worldtime2text()]. \n\nThe automated systems aboard the [station_name()] will now return the public hallway lighting levels to normal.", "Automated Lighting System", new_sound = 'sound/misc/bosuns_whistle.ogg')
deactivate()
if (NIGHT_LIGHT_ACTIVE to TICKS_IN_DAY)
if (config.nl_start to TICKS_IN_DAY)
if (!isactive)
command_announcement.Announce("Good evening. The time is [worldtime2text()]. \n\nThe automated systems aboard the [station_name()] will now dim lighting in the public hallways in order to accommodate the circadian rhythm of some species.", "Automated Lighting System", new_sound = 'sound/misc/bosuns_whistle.ogg')
activate()
+8
View File
@@ -176,6 +176,8 @@ var/list/gamemode_cache = list()
var/ghost_interaction = 0
var/night_lighting = 0
var/nl_start = 19 * TICKS_IN_HOUR
var/nl_finish = 8 * TICKS_IN_HOUR
var/comms_password = ""
@@ -622,6 +624,12 @@ var/list/gamemode_cache = list()
if("night_lighting")
config.night_lighting = 1
if("nl_start_hour")
config.nl_start = text2num(value) * TICKS_IN_HOUR
if("nl_finish_hour")
config.nl_finish = text2num(value) * TICKS_IN_HOUR
if("disable_player_mice")
config.disable_player_mice = 1
+29
View File
@@ -1669,3 +1669,32 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
containername = "security magnetic locks"
access = access_security
group = "Security"
/datum/supply_packs/randomised/glowsticks
name = "Glowsticks crate"
num_contained = 4
contains = list(/obj/item/device/flashlight/glowstick,
/obj/item/device/flashlight/glowstick/red,
/obj/item/device/flashlight/glowstick/blue,
/obj/item/device/flashlight/glowstick/orange,
/obj/item/device/flashlight/glowstick/yellow)
cost = 25
containertype = /obj/structure/closet/crate
containername = "glowsticks crate"
group = "Operations"
/datum/supply_packs/randomised/illegalguns
name = "Illegal weapons crate"
num_contained = 2
contains = list(/obj/item/weapon/gun/projectile/automatic/mini_uzi,
/obj/item/weapon/gun/projectile/boltaction,
/obj/item/weapon/gun/projectile/silenced,
/obj/item/weapon/gun/projectile/pirate,
/obj/item/weapon/gun/projectile/revolver/derringer,
/obj/item/weapon/gun/projectile/dragunov,
/obj/item/weapon/gun/energy/retro)
cost = 120
containertype = /obj/structure/closet/crate
containername = "Unlabeled crate"
contraband = 1
group = "Security"
+6 -6
View File
@@ -404,7 +404,7 @@
if(willing)
visible_message("[user] starts putting [G:affecting:name] into \the [src].", 3)
visible_message("[user] starts putting [G:affecting:name] into \the [name].", 3)
if(do_after(user, 20))
if(!M || !G || !G:affecting) return
@@ -444,7 +444,7 @@
var/mob/living/L = O
if(L.stat == DEAD)
user << "<span class='notice'>Dead people can not be put into cryo.</span>"
user << "<span class='notice'>Dead people can not be put into stasis.</span>"
return
for(var/mob/living/carbon/slime/M in range(1,L))
@@ -455,7 +455,7 @@
var/willing = null //We don't want to allow people to be forced into despawning.
if(L.client)
if(alert(L,"Would you like to enter cryosleep?",,"Yes","No") == "Yes")
if(alert(L,"Would you like to enter stasis?",,"Yes","No") == "Yes")
if(!L) return
willing = 1
else
@@ -463,9 +463,9 @@
if(willing)
if(L == user)
visible_message("[user] starts climbing into the cryo pod.", 3)
visible_message("[user] starts climbing into \the [name].", 3)
else
visible_message("[user] starts putting [L] into the cryo pod.", 3)
visible_message("[user] starts putting [L] into \the [name].", 3)
if(do_after(user, 20))
if(!L) return
@@ -476,7 +476,7 @@
L.client.perspective = EYE_PERSPECTIVE
L.client.eye = src
else
user << "<span class='notice'>You stop [L == user ? "climbing into the cryo pod." : "putting [L] into the cryo pod."]</span>"
user << "<span class='notice'>You stop [L == user ? "climbing into" : "putting [L] into"] \the [name].</span>"
return
icon_state = occupied_icon_state
@@ -13,7 +13,7 @@
//icon_state = "inactive"
w_class = 3
req_access = list(access_cent_specops)
health = 90
health = 150
var/department = "CENTCOM"
var/status = 0
@@ -107,13 +107,17 @@
user << "<span class='danger'>You cannot swipe your [I] through [src] with it partially dismantled!</span>"
return
if (istype(I, /obj/item/weapon) && user.a_intent == "hurt")
if (I.force >= 8)
if (istype(I, /obj/item/weapon) && user.a_intent == "harm")
if (I.force >= 18)
user.visible_message("<span class='danger'>[user] bashes [src] with [I]!</span>", "<span class='danger'>You strike [src] with [I], damaging it!</span>")
takedamage(I.force)
playsound(loc, "sound/weapons/genhit[rand(1,3)].ogg", I.force*3, 1)
spawn(3)
playsound(loc, "sound/effects/sparks[rand(1,4)].ogg", 30, 1)
return
else
user.visible_message("<span class='notice'>[user] hits [src] with [I] to no visible effect.</span>", "<span class='notice'>You hit [src] with [I], but it appears to have no effect.</span>")
user.visible_message("<span class='danger'>[user] hits [src] with [I] but fails to damage it.</span>", "<span class='warning'>You hit [src] with [I], [I.force >= 10 ? "and it almost makes a dent!" : "but it appears to have no visible effect."]</span>")
playsound(loc, "sound/weapons/Genhit.ogg", I.force*2.5, 1)
return
switch (constructionstate)
@@ -402,13 +406,14 @@
overlays += "overlay_deconstruct_[constructionstate]"
/obj/item/device/magnetic_lock/proc/takedamage(var/damage)
health -= damage
health -= rand(damage/2, damage)
if (damage >= 40 && prob(50))
health = 0
if (health <= 0)
visible_message("<span class='danger'>[src] sparks[target ? " and falls off of \the [target]!" : "!"] It is now completely unusable!</span>")
detach(0)
status = STATUS_BROKEN
update_icon()
return
+20 -11
View File
@@ -10,9 +10,9 @@
var/heal_brute = 0
var/heal_burn = 0
/obj/item/stack/medical/attack(mob/living/carbon/M as mob, mob/user as mob)
if (!istype(M))
user << "<span class='warning'>\The [src] cannot be applied to [M]!</span>"
/obj/item/stack/medical/attack(mob/living/M as mob, mob/user as mob)
if (!istype(M) || istype(M, /mob/living/silicon))
user << "\red \The [src] cannot be applied to [M]!"
return 1
if ( ! (istype(user, /mob/living/carbon/human) || \
@@ -40,13 +40,21 @@
H.UpdateDamageIcon()
else
if (!M.bruteloss && !M.fireloss)
user << "<span class='notice'> [M] seems healthy, there are no wounds to treat! </span>"
return 1
M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2))
user.visible_message( \
"<span class='notice'>[M] has been applied with [src] by [user].</span>", \
"<span class='notice'>You apply \the [src] to [M].</span>" \
)
use(1)
"<span class = 'notice'> [user] starts applying \the [src] to [M].</span>", \
"<span class = 'notice'> You start applying \the [src] to [M].</span>" \
)
if (do_mob(user, M, 30))
M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2))
user.visible_message( \
"<span class = 'notice'> [M] has been applied with [src] by [user].</span>", \
"<span class = 'notice'> You apply \the [src] to [M].</span>" \
)
use(1)
M.updatehealth()
/obj/item/stack/medical/bruise_pack
@@ -55,6 +63,7 @@
desc = "Some sterile gauze to wrap around bloody stumps."
icon_state = "brutepack"
origin_tech = list(TECH_BIO = 1)
heal_brute = 4
/obj/item/stack/medical/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
@@ -114,7 +123,7 @@
gender = PLURAL
singular_name = "ointment"
icon_state = "ointment"
heal_burn = 1
heal_burn = 4
origin_tech = list(TECH_BIO = 1)
/obj/item/stack/medical/ointment/attack(mob/living/carbon/M as mob, mob/user as mob)
@@ -151,7 +160,7 @@
singular_name = "advanced trauma kit"
desc = "An advanced trauma kit for severe injuries."
icon_state = "traumakit"
heal_brute = 0
heal_brute = 8
origin_tech = list(TECH_BIO = 1)
/obj/item/stack/medical/advanced/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
@@ -213,7 +222,7 @@
singular_name = "advanced burn kit"
desc = "An advanced treatment kit for severe burns."
icon_state = "burnkit"
heal_burn = 0
heal_burn = 8
origin_tech = list(TECH_BIO = 1)
+17 -6
View File
@@ -510,10 +510,9 @@
/obj/random/coin/item_to_spawn()
var/list/coin = list("/obj/item/weapon/coin/iron" = 5,
"/obj/item/weapon/coin/silver" = 3,
"/obj/item/weapon/coin/gold" = 1,
"/obj/item/weapon/coin/silver" = 0.7,
"/obj/item/weapon/coin/gold" = 0.7,
"/obj/item/weapon/coin/phoron" = 0.5,
"obj/item/weapon/coin/uranium" = 0.5,
"/obj/item/weapon/coin/uranium" = 0.5,
"/obj/item/weapon/coin/platinum" = 0.2,
"/obj/item/weapon/coin/diamond" = 0.1,
)
@@ -581,7 +580,7 @@
"/obj/item/clothing/glasses/material" = 0.8,
"/obj/item/clothing/glasses/sunglasses" = 1.5,
"/obj/item/clothing/glasses/welding" = 1.2,
"/obj/item/clothing/under/captain_fly" = 0.7,
"/obj/item/clothing/under/captain_fly" = 0.5,
"/obj/item/clothing/under/rank/mailman" = 0.6,
"/obj/item/clothing/under/rank/vice" = 0.8,
"/obj/item/clothing/under/assistantformal" = 1,
@@ -591,9 +590,11 @@
"/obj/item/clothing/under/serviceoveralls" = 1,
"/obj/item/clothing/under/psyche" = 0.5,
"/obj/item/clothing/under/track" = 0.9,
"/obj/item/clothing/under/rank/dispatch" = 1,
"/obj/item/clothing/under/rank/dispatch" = 0.8,
"/obj/item/clothing/under/syndicate/tacticool" = 1,
"/obj/item/clothing/under/syndicate/tracksuit" = 0.2,
"/obj/item/clothing/under/rank/clown" = 0.1,
"/obj/item/clothing/under/mime" = 0.1,
"/obj/item/clothing/accessory/badge" = 0.2,
"/obj/item/clothing/accessory/badge/old" = 0.2,
"/obj/item/clothing/accessory/storage/webbing" = 0.6,
@@ -620,6 +621,8 @@
"/obj/item/clothing/mask/gas/syndicate" = 0.4,
"/obj/item/clothing/mask/fakemoustache" = 0.4,
"/obj/item/clothing/mask/horsehead" = 0.9,
"/obj/item/clothing/mask/gas/clown_hat" = 0.1,
"/obj/item/clothing/mask/gas/mime" = 0.1,
"/obj/item/clothing/shoes/rainbow" = 1,
"/obj/item/clothing/shoes/jackboots" = 1,
"/obj/item/clothing/shoes/workboots" = 1,
@@ -658,6 +661,7 @@
"/obj/item/device/flashlight/maglight" = 0.4,
"/obj/item/device/flashlight/flare" = 0.5,
"/obj/item/device/flashlight/lantern" = 0.4,
"/obj/item/device/taperecorder" = 0.6,
"/obj/item/weapon/reagent_containers/food/drinks/teapot" = 0.4,
"/obj/item/weapon/reagent_containers/food/drinks/flask/shiny" = 0.3,
"/obj/item/weapon/reagent_containers/food/drinks/flask/lithium" = 0.3,
@@ -679,7 +683,10 @@
"/obj/random/colored_jumpsuit" = 0.7,
"/obj/random/booze" = 1.1,
"/obj/random/belt" = 0.9,
"/obj/random/backpack" = 0.7,
"/obj/random/contraband" = 0.9,
"/obj/random/firstaid" = 0.4,
"/obj/random/medical" = 0.4,
"/obj/random/glowstick" = 0.7,
"/obj/item/weapon/caution/cone" = 0.7,
"/obj/item/weapon/staff/broom" = 0.5,
@@ -688,6 +695,10 @@
"/obj/item/weapon/storage/box/donkpockets" = 0.6,
"/obj/item/weapon/contraband/poster" = 1.3,
"/obj/item/device/magnetic_lock/security" = 0.3,
"/obj/item/device/magnetic_lock/engineering" = 0.3
"/obj/item/device/magnetic_lock/engineering" = 0.3,
"/obj/item/weapon/shovel" = 0.5,
"/obj/item/weapon/pickaxe" = 0.4,
"/obj/item/weapon/pickaxe" = 0.4,
"/obj/item/weapon/inflatable_duck" = 0.2
)
return pickweight(maint)
+4
View File
@@ -160,3 +160,7 @@ var/max_explosion_range = 14
var/global/obj/item/device/radio/intercom/global_announcer = new(null)
var/list/station_departments = list("Command", "Medical", "Engineering", "Science", "Security", "Cargo", "Civilian")
var/global/const/TICKS_IN_DAY = 864000
var/global/const/TICKS_IN_HOUR = 36000
var/global/const/TICKS_IN_SECOND = 10
+94 -48
View File
@@ -32,6 +32,31 @@ more variety, and keeps the odds of any one specific item to be about the same
*/
//Debugging verbs. Uncomment this block for some useful cargo debug commands
/*
var/global/stockname = ""
/client/verb/set_stock_name()
stockname = input(usr, "Enter name", "Select stock by name") as text
/client/verb/spawn_1()
spawn_stock(stockname, get_turf(mob))
/client/verb/spawn_10()
var/num = 10
while (num > 0)
spawn_stock(stockname, get_turf(mob))
num--
/client/verb/spawn_100()
var/num = 100
while (num > 0)
spawn_stock(stockname, get_turf(mob))
num--
*/
var/list/global/random_stock_common = list(
"toolbox" = 4,
"meds" = 5,
@@ -90,15 +115,16 @@ var/list/global/random_stock_common = list(
"cosmetic" = 2.2,
"suitcooler" = 1.2,
"officechair" = 1.2,
"booze" = 3,
"booze" = 3.5,
"plant" = 3.5,
"bag" = 2,
"extinguish" = 2.2,
"hailer" = 1.1,
"target" = 2,
"snacks" = 3.5,
"oxytank" = 2.5,
"snacks" = 4,
"oxytank" = 2.5,//
"signs" = 4,
"posters" = 3,
"parts" = 6,
"cane" = 2,
"warning" = 2.2,
@@ -120,7 +146,7 @@ var/list/global/random_stock_uncommon = list(
"flare" = 2,
"deathalarm" = 2,
"trackimp" = 1,
"flashbang" = 1,
"flashbang" = 0.75,
"cuffs" = 1,
"monkey" = 2,
"specialcrayon" = 1.5,
@@ -136,8 +162,8 @@ var/list/global/random_stock_uncommon = list(
"bible" = 1,
"advwelder" = 2,
"sord" = 1,
"policebaton" = 2,
"stunbaton" = 1,//batons spawn with no powercell
"policebaton" = 1.5,
"stunbaton" = 0.75,//batons spawn with no powercell
"watches" = 3,
"MMI" = 1.5,
"voidsuit" = 2,
@@ -153,21 +179,21 @@ var/list/global/random_stock_uncommon = list(
"linenbin" = 1,
"coatrack" = 1,
"riotshield" = 2,
"fireaxe" = 1.5,
"fireaxe" = 1,
"service" = 2,
"robot" = 2,
"latexb" = 1.2,
"latexb" = 0.5,
"taperoll" = 1,
"headset" = 2,
"bat" = 1.2,
"scythe" = 1,
"scythe" = 0.75,
"manual" = 2,
"jammer" = 2,
"rped" = 2,
"briefcase" = 2,
"blade" = 1.5,
"blade" = 1.2,
"exoquip" = 2,
"laserscalpel" = 1.5,
"laserscalpel" = 1.3,
"electropack" = 1,
"nothing" = 0)
@@ -175,30 +201,29 @@ var/list/global/random_stock_rare = list(
"gold" = 2.5,
"diamond" = 1.5,
"uranium" = 3,
"EMP" = 1,
"EMP" = 0.75,
"hypercell" = 3,
"combatmeds" = 3,
"batterer" = 1,
"batterer" = 0.75,
"posibrain" = 3,
"augmentvision" = 1.6,
"thermals" = 2,
"thermals" = 0.75,
"bsbeaker" = 3,
"energyshield" = 3,
"energyshield" = 2,
"hardsuit" = 0.75,
"cluster" = 2.0,
"cloak" = 1,
"sword" = 1,
"cloak" = 0.75,
"sword" = 0.5,
"ims" = 1.5,
"exogear" = 1.5,
"teleporter" = 1,
"voice" = 2,
"voice" = 1.5,
"nothing" = 0)
var/list/global/random_stock_large = list(
"russian" = 1,
"emergency" = 2,
"firecloset" = 2,
"tacticool" = 0.4,
"tacticool" = 0.2,
"radsuit" = 3,
"exosuit" = 1.2,//A randomly generated exosuit in a very variable condition.
"EOD" = 1.5,
@@ -572,8 +597,12 @@ var/list/global/random_stock_large = list(
if("circuitboard")
//Spawns a random circuitboard
//Allboards being a global list might be faster, but it didnt seem worth the extra memory
var/list/allboards = typesof(/obj/item/weapon/circuitboard)
allboards -= typesof(/obj/item/weapon/circuitboard/mecha)
var/list/allboards = subtypesof(/obj/item/weapon/circuitboard)
var/list/exclusion = list(/obj/item/weapon/circuitboard/unary_atmos, \
/obj/item/weapon/circuitboard/telecomms, )
exclusion += typesof(/obj/item/weapon/circuitboard/mecha)
allboards -= exclusion
var/type = pick(allboards)
new type(L)
@@ -629,14 +658,18 @@ var/list/global/random_stock_large = list(
new /obj/item/weapon/grenade/chem_grenade/metalfoam(L)
if ("gloves")
var/list/allgloves = typesof(/obj/item/clothing/gloves)
var/list/exclusion = list(/obj/item/clothing/gloves,
/obj/item/clothing/gloves/fluff,
/obj/item/clothing/gloves/swat/bst)
exclusion += typesof(/obj/item/clothing/gloves/rig)
exclusion += typesof(/obj/item/clothing/gloves/lightrig)
allgloves -= exclusion
var/number = rand(1,5)
while (number > 0)
var/gtype = pick(allgloves)
var/thing = new gtype(L)
if (!istype(thing, /obj/item/clothing/gloves/rig))//Rig gloves would be buggy
number--
else
qdel(thing)
new gtype(L)
number--
if ("insulated")
new /obj/item/clothing/gloves/yellow(L)
new /obj/item/clothing/gloves/yellow(L)
@@ -650,7 +683,6 @@ var/list/global/random_stock_large = list(
"/obj/item/device/slime_scanner" = 1,
"/obj/item/weapon/autopsy_scanner" = 1,
"/obj/item/device/robotanalyzer" = 4,
"/obj/machinery/disease2/diseaseanalyser" = 0.5,
"/obj/item/weapon/mining_scanner" = 1,
"/obj/item/device/ano_scanner" = 1,
"/obj/item/device/reagent_scanner" = 2,
@@ -756,7 +788,7 @@ var/list/global/random_stock_large = list(
new /obj/structure/reagent_dispensers/beerkeg(T)
else
var/list/drinks = typesof(/obj/item/weapon/reagent_containers/food/drinks/bottle)
drinks -= /obj/item/weapon/reagent_containers/food/drinks/bottle
var/number = rand(1,3)
while (number > 0)
var/type = pick(drinks)
@@ -884,8 +916,6 @@ var/list/global/random_stock_large = list(
new /obj/item/weapon/cane/concealed(L)
else if (prob(20))
new /obj/item/weapon/staff/broom(L)
else if (prob(30))
new /obj/item/weapon/staff/stick(L)
else
new /obj/item/weapon/cane(L)
@@ -905,7 +935,6 @@ var/list/global/random_stock_large = list(
"/obj/item/clothing/mask/gas/mime" = 0.5,
"/obj/item/clothing/mask/gas/monkeymask" = 0.5,
"/obj/item/clothing/mask/gas/sexymime" = 0.5,
"/obj/item/clothing/mask/gas/death_commando" = 2,
"/obj/item/clothing/mask/gas/cyborg" = 1,
"/obj/item/clothing/mask/gas/owl_mask" = 1
)
@@ -933,6 +962,8 @@ var/list/global/random_stock_large = list(
new /obj/item/device/flashlight/lantern(L)
if (prob(50))
new /obj/item/weapon/mining_scanner(L)
if (prob(25))
new /obj/item/weapon/storage/box/excavation(L)
if ("paicard")
new /obj/item/device/paicard(L)
@@ -1066,15 +1097,18 @@ var/list/global/random_stock_large = list(
//Can be slotted into any dispenser
if("chempack")
var/total = rand(2,6)
var/list/chems = chemical_reagents_list.Copy()
var/list/exclusion = list("drink", "reagent", "adminordrazine", "beer2")
chems -= exclusion
for (var/i=0,i<total,i++)
var/obj/item/weapon/reagent_containers/chem_disp_cartridge/C = new /obj/item/weapon/reagent_containers/chem_disp_cartridge(L)
var/rname = pick(chemical_reagents_list)
var/rname = pick(chems)
var/datum/reagent/R = chemical_reagents_list[rname]
//If we get a drink, reroll it once.
//Should result in a higher chance of getting medicines and chemicals
if (istype(R, /datum/reagent/drink) || istype(R, /datum/reagent/ethanol))
rname = pick(chemical_reagents_list)
rname = pick(chems)
R = chemical_reagents_list[rname]
C.reagents.add_reagent(rname, C.volume)
C.setLabel(R.name)
@@ -1095,8 +1129,13 @@ var/list/global/random_stock_large = list(
//Spawns several random circuitboards
if("circuitboards")
var/list/allboards = typesof(/obj/item/weapon/circuitboard)
allboards -= typesof(/obj/item/weapon/circuitboard/mecha)
var/list/allboards = subtypesof(/obj/item/weapon/circuitboard)
var/list/exclusion = list(/obj/item/weapon/circuitboard/unary_atmos, \
/obj/item/weapon/circuitboard/telecomms, )
exclusion += typesof(/obj/item/weapon/circuitboard/mecha)
allboards -= exclusion
var/number = rand(2,5)
while (number > 0)
var/type = pick(allboards)
@@ -1138,8 +1177,10 @@ var/list/global/random_stock_large = list(
new /obj/random/voidsuit(L,1)
if ("signs")
var/list/allsigns = typesof(/obj/structure/sign)
var/list/allsigns = subtypesof(/obj/structure/sign)
allsigns -= typesof(/obj/structure/sign/double)
allsigns -= typesof(/obj/structure/sign/poster)
allsigns -= /obj/structure/sign/directions
var/number = rand(1,5)
while (number > 0)
@@ -1148,6 +1189,12 @@ var/list/global/random_stock_large = list(
var/obj/structure/sign/S = new newsign(L)
S.unfasten()
number--
if ("posters")
new /obj/item/weapon/contraband/poster(L)
if (prob(50))
new /obj/item/weapon/contraband/poster(L)
if (prob(50))
new /obj/item/weapon/contraband/poster(L)
if ("violin")
new /obj/item/device/violin(L)
@@ -1415,8 +1462,6 @@ var/list/global/random_stock_large = list(
new /obj/item/device/batterer(L)
if("posibrain")
new /obj/item/device/mmi/digital/posibrain(L)
if("augmentvision")
new /obj/item/clothing/glasses/hud/security/jensenshades(L)
if("thermals")
new /obj/item/clothing/glasses/thermal(L)
if("bsbeaker")
@@ -1448,30 +1493,30 @@ var/list/global/random_stock_large = list(
//It will come with some screwy electronics and possibly need reprogramming
var/list/rigs = list(
"/obj/item/weapon/rig/unathi" = 2,
"/obj/item/weapon/rig/unathi/fancy" = 1,
"/obj/item/weapon/rig/unathi/fancy" = 0.75,
"/obj/item/weapon/rig/combat" = 0.1,
"/obj/item/weapon/rig/ert" = 0.2,
"/obj/item/weapon/rig/ert/engineer" = 0.2,
"/obj/item/weapon/rig/ert/medical" = 0.3,
"/obj/item/weapon/rig/ert/security" = 0.15,
"/obj/item/weapon/rig/ert/assetprotection" = 0.1,
"/obj/item/weapon/rig/ert" = 0.1,
"/obj/item/weapon/rig/ert/engineer" = 0.1,
"/obj/item/weapon/rig/ert/medical" = 0.15,
"/obj/item/weapon/rig/ert/security" = 0.075,
"/obj/item/weapon/rig/ert/assetprotection" = 0.05,
"/obj/item/weapon/rig/light" = 0.5,
"/obj/item/weapon/rig/light/hacker" = 0.8,
"/obj/item/weapon/rig/light/stealth" = 1.5,
"/obj/item/weapon/rig/merc" = 1,
"/obj/item/weapon/rig/merc" = 0.5,
"/obj/item/weapon/rig/industrial" = 3,
"/obj/item/weapon/rig/eva" = 3,
"/obj/item/weapon/rig/ce" = 2,
"/obj/item/weapon/rig/hazmat" = 4,
"/obj/item/weapon/rig/medical" = 4,
"/obj/item/weapon/rig/hazard" = 4,
"/obj/item/weapon/rig/hazard" = 3,
)
var/type = pickweight(rigs)
var/obj/item/weapon/rig/module = new type(L)
//screw it up a bit
var/cnd = rand(1,100)
var/cnd = rand(40,100)
module.lose_modules(cnd)
module.misconfigure(cnd)
module.sabotage_cell()
@@ -1506,6 +1551,7 @@ var/list/global/random_stock_large = list(
while (number > 0)
var/type = pickweight(equips)
new type(L)
number--
if ("teleporter")
new /obj/item/weapon/hand_tele(L)
+1 -2
View File
@@ -154,9 +154,8 @@
M.implant_loyalty(M, 1)
var/obj/item/weapon/card/id/W = new(M)
var/obj/item/weapon/card/id/centcom/W = new(M)
W.name = "[M.real_name]'s ID Card"
W.icon_state = "centcom"
W.item_state = "id_inv"
W.access = get_all_accesses() + get_centcom_access("CCIA Agent")
W.assignment = "Central Command Internal Affairs Agent"
+10 -4
View File
@@ -1108,6 +1108,12 @@ var/global/list/gear_datums = list()
path = /obj/item/clothing/gloves/white/tajara
cost = 2
slot = slot_gloves
/datum/gear/watch
display_name = "watch"
path = /obj/item/clothing/gloves/watch
cost = 2
slot = slot_gloves
// Shoelocker
@@ -1116,21 +1122,21 @@ var/global/list/gear_datums = list()
path = /obj/item/clothing/shoes/jackboots
cost = 1
slot = slot_shoes
allowed_roles = list("Security Cadet","Security Officer","Head of Security","Warden","Detective","Internal Affairs Agent","Quartermaster","Head of Personnel","Captain")
// allowed_roles = list("Security Cadet","Security Officer","Head of Security","Warden","Detective","Internal Affairs Agent","Quartermaster","Head of Personnel","Captain")
/datum/gear/toeless_jackboots
display_name = "toe-less jackboots"
path = /obj/item/clothing/shoes/jackboots/unathi
cost = 1
slot = slot_shoes
allowed_roles = list("Security Cadet","Security Officer","Head of Security","Warden","Detective","Internal Affairs Agent","Quartermaster","Head of Personnel","Captain")
// allowed_roles = list("Security Cadet","Security Officer","Head of Security","Warden","Detective","Internal Affairs Agent","Quartermaster","Head of Personnel","Captain")
/datum/gear/workboots
display_name = "workboots"
path = /obj/item/clothing/shoes/workboots
cost = 1
slot = slot_shoes
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Engineering Apprentice")
// allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Engineering Apprentice")
/datum/gear/sandal
display_name = "sandals"
@@ -1558,4 +1564,4 @@ var/global/list/gear_datums = list()
display_name = "neck bandanna, black"
path = /obj/item/clothing/ears/bandanna/black
cost = 1
sort_category = "ears"
sort_category = "ears"
+50 -3
View File
@@ -573,10 +573,10 @@ All custom items with worn sprites must follow the contained sprite system: http
last_special = world.time + 500
var/obj/item/organ/F = src.internal_organs_by_name["heart"]
if(isnull(F))
return
F.damage += 5
src << "<span class='warning'>You feel a stabbing pain in your chest!</span>"
playsound(user, 'sound/effects/Heart Beat.ogg', 20, 1)
@@ -616,9 +616,56 @@ All custom items with worn sprites must follow the contained sprite system: http
item_state = "poslan_jacket"
contained_sprite = 1
/obj/item/sign/fluff/alexis_degree //Xenonuerology Doctorate - Alexis Shaw - Tenenza - DONE
name = "xenonuerology degree"
desc = "Certification for a doctorate in Xenonuerology, made out to Alexis Shaw by the St. Grahelm University of Biesel, authenticated by watermarking."
icon_state = "alexis_degree"
sign_state = "alexis_degree"
w_class = 2
w_class = 2
/obj/item/clothing/mask/fluff/rur_collar //Tagging Collar - R.U.R - coalf - DONE
name = "tagging collar"
desc = "A steel tagging collar, a giant golden D is imprinted on the front."
icon = 'icons/obj/custom_items/rur_collar.dmi'
icon_state = "rur_collar"
item_state = "rur_collar"
contained_sprite = 1
body_parts_covered = 0
canremove = 0
species_restricted = list("Machine")
var/emagged = 0
/obj/item/clothing/mask/fluff/rur_collar/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/weapon/card/emag) && !emagged)
user << "<span class='danger'>You short out \the [src]'s locking mechanism.</span>"
src.icon_state = "rur_collar_broken"
src.canremove = 1
src.emagged = 1
playsound(src.loc, 'sound/effects/sparks1.ogg', 100, 0)
return
return
/obj/item/clothing/mask/bluescarf/fluff/simon_scarf //Fancy Scarf - Simon Greene - icydew - DONE
name = "fancy scarf"
desc = "A very smooth, dark blue scarf with a golden trim. It feels really new and clean."
icon = 'icons/obj/custom_items/simon_scarf.dmi'
icon_state = "simon_scarf"
item_state = "simon_scarf"
contained_sprite = 1
/obj/item/clothing/head/soft/sec/corp/fluff/karson_cap //Karson's Cap - Eric Karson - dronzthewolf - DONE
name = "well-worn corporate security cap"
desc = "A well-worn corporate security cap. The name Karson is written on the underside of the brim, it is well-worn at the point where it has shaped to the owner's head."
/obj/item/sign/fluff/triaka_atimono //Framed Zatimono - Azkuyua Triaka - jackboot - DONE
name = "framed zatimono"
desc = "A framed Zatimono, a Unathi standard worn into battle similar to an old-Earth Sashimono. This one is slightly faded."
icon_state = "triaka_atimono"
sign_state = "triaka_atimono"
w_class = 2
+6 -1
View File
@@ -1743,13 +1743,18 @@
if (failed_last_breath || oxyloss > exhaust_threshold)//Can't catch our breath if we're suffocating
return
if (nutrition <= 0)
if (prob(1.5))
src << span("warning", "You feel hungry and exhausted, eat something to regain your energy!")
return
if (stamina != max_stamina)
//Any suffocation damage slows stamina regen.
//This includes oxyloss from low blood levels
var/regen = stamina_recovery * (1 - min(((oxyloss*2) / exhaust_threshold), 1))
if (regen > 0)
stamina = min(max_stamina, stamina+regen)
nutrition -= stamina_recovery*0.4
nutrition = max(0, nutrition - stamina_recovery*0.18)
hud_used.move_intent.update_move_icon(src)
/mob/living/carbon/human/proc/update_health_display()
@@ -20,7 +20,7 @@
stamina = 120 // Vox are even faster than unathi and can go longer, but recover slowly
sprint_speed_factor = 3
stamina_recovery = 1
sprint_cost_factor = 1.7
sprint_cost_factor = 1
speech_sounds = list('sound/voice/shriek1.ogg')
speech_chance = 20
@@ -128,8 +128,8 @@
var/stamina = 100 // The maximum stamina this species has. Determines how long it can sprint
var/stamina_recovery = 3 // Flat amount of stamina species recovers per proc
var/sprint_speed_factor = 0.65 // The percentage of bonus speed you get when sprinting. 0.4 = 40%
var/sprint_cost_factor = 1.0 // Multiplier on stamina cost for sprinting
var/sprint_speed_factor = 0.7 // The percentage of bonus speed you get when sprinting. 0.4 = 40%
var/sprint_cost_factor = 0.9 // Multiplier on stamina cost for sprinting
var/exhaust_threshold = 50 // When stamina runs out, the mob takes oxyloss up til this value. Then collapses and drops to walk
// Determines the organs that the species spawns with and
@@ -21,8 +21,8 @@
stamina = 130 // Humans can sprint for longer than any other species
stamina_recovery = 5
sprint_speed_factor = 0.8
sprint_cost_factor = 0.7
sprint_speed_factor = 0.9
sprint_cost_factor = 0.5
/datum/species/unathi
name = "Unathi"
@@ -43,9 +43,10 @@
secondary_langs = list("Sinta'unathi")
name_language = "Sinta'unathi"
stamina = 120 // Unathi have the shortest but fastest sprint of all
sprint_speed_factor = 3
sprint_speed_factor = 3.2
stamina_recovery = 5
sprint_cost_factor = 1.8
sprint_cost_factor = 1.45
exhaust_threshold = 65
rarity_value = 3
blurb = "A heavily reptillian species, Unathi (or 'Sinta as they call themselves) hail from the \
@@ -116,8 +117,8 @@
stamina = 90 // Tajarans evolved to maintain a steady pace in the snow, sprinting wastes energy
stamina_recovery = 4
sprint_speed_factor = 0.55
sprint_cost_factor = 1
sprint_speed_factor = 0.65
sprint_cost_factor = 0.75
blurb = "The Tajaran race is a species of feline-like bipeds hailing from the planet of Ahdomai in the \
@@ -184,7 +185,7 @@
ethanol_resistance = 0.5//gets drunk faster
stamina = 90
sprint_speed_factor = 1.1 //Evolved for rapid escapes from predators
sprint_speed_factor = 1.25 //Evolved for rapid escapes from predators
/datum/species/diona
@@ -263,8 +264,8 @@
reagent_tag = IS_DIONA
stamina = -1 // Diona sprinting uses energy instead of stamina
sprint_speed_factor = 0.4 //Speed gained is minor
sprint_speed_factor = 0.5 //Speed gained is minor
sprint_cost_factor = 0.8
/datum/species/diona/handle_sprint_cost(var/mob/living/carbon/human/H, var/cost)
var/datum/dionastats/DS = H.get_dionastats()
@@ -272,7 +273,7 @@
if (!DS)
return 0 //Something is very wrong
var/remainder = cost
var/remainder = cost * sprint_cost_factor
if (H.radiation)
if (H.radiation > (cost*0.5))//Radiation counts as double energy
@@ -402,13 +403,13 @@
"Your CPU temperature probes warn you that you are approaching critical heat levels!"
)
stamina = -1 // Machines use power and generate heat, stamina is not a thing
sprint_speed_factor = 0.85 // About as capable of speed as a human
sprint_speed_factor = 1 // About as capable of speed as a human
/datum/species/machine/handle_sprint_cost(var/mob/living/carbon/human/H, var/cost)
if (H.stat == CONSCIOUS)
H.bodytemperature += cost*1.35
H.nutrition -= cost*0.9
H.bodytemperature += cost*1.15
H.nutrition -= cost*0.65
if (H.nutrition > 0)
return 1
else
@@ -470,8 +471,8 @@
base_color = "#575757"
stamina = 100 // Long period of sprinting, but relatively low speed gain
sprint_speed_factor = 0.5
sprint_cost_factor = 0.27
sprint_speed_factor = 0.55
sprint_cost_factor = 0.20
stamina_recovery = 1//slow recovery
+1 -1
View File
@@ -59,7 +59,7 @@
else
newspeed = text2num(response)
if (!newspeed || newspeed >= speed || newspeed <= 0)
if (!newspeed || newspeed >= speed || newspeed <= 0.2)
src << "Error, invalid value entered. Walk speed has not been changed"
return
@@ -142,6 +142,11 @@
user << "<span class='notice'>It looks hungry.</span>"
else if ((reagents.total_volume > 0 && nutrition > max_nutrition *0.75) || nutrition > max_nutrition *0.9)
user << "It looks full and contented."
if (health < maxHealth * 0.5)
user << "<span class='danger'>It looks badly wounded.</span>"
else if (health < maxHealth)
user << "<span class='warning'>It looks wounded.</span>"
/mob/living/simple_animal/Life()
..()
@@ -293,7 +298,16 @@
if (istype(current, /datum/reagent/nutriment))//If its food, it feeds us
var/datum/reagent/nutriment/N = current
nutrition += removed*N.nutriment_factor
health = min(health+(removed*N.regen_factor), maxHealth)
var/heal_amount = removed*N.regen_factor
if (bruteloss > 0)
var/n = min(heal_amount, bruteloss)
adjustBruteLoss(-n)
heal_amount -= n
if (fireloss && heal_amount)
var/n = min(heal_amount, fireloss)
adjustFireLoss(-n)
heal_amount -= n
updatehealth()
current.remove_self(removed)//If its not food, it just does nothing. no fancy effects
/mob/living/simple_animal/can_eat()
@@ -373,21 +387,7 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj)
return
/mob/living/simple_animal/attackby(var/obj/item/O, var/mob/user)
if(istype(O, /obj/item/stack/medical))
if(stat != DEAD)
var/obj/item/stack/medical/MED = O
if(health < maxHealth)
if(MED.amount >= 1)
adjustBruteLoss(-MED.heal_brute)
MED.amount -= 1
if(MED.amount <= 0)
qdel(MED)
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
M.show_message("<span class='notice'>[user] applies the [MED] on [src].</span>")
else
user << "<span class='notice'>\The [src] is dead, medical items won't bring \him back to life.</span>"
else if(istype(O, /obj/item/weapon/reagent_containers))
if(istype(O, /obj/item/weapon/reagent_containers) || istype(O, /obj/item/stack/medical))
..()
else if(meat_type && (stat == DEAD)) //if the animal has a meat, and if it is dead.
+28 -6
View File
@@ -192,7 +192,19 @@
if(moving) return 0
if(world.time < move_delay) return
if(world.time < move_delay)
return
//This compensates for the inaccuracy of move ticks
//Whenever world.time overshoots the movedelay, due to it only ticking once per decisecond
//The overshoot value is subtracted from our next delay, farther down where move delay is set.
//This doesn't entirely remove the problem, but it keeps travel times accurate to within 0.1 seconds
//Over an infinite distance, and prevents the inaccuracy from compounding. Thus making it basically a non-issue
var/leftover = world.time - move_delay
if (leftover > 1)
leftover = 0
if(locate(/obj/effect/stop/, mob.loc))
for(var/obj/effect/stop/S in mob.loc)
@@ -266,9 +278,9 @@
src << "\blue You're pinned to a wall by [mob.pinned[1]]!"
return 0
move_delay = world.time //set move delay
move_delay = world.time - leftover//set move delay
if (mob.buckled || mob.pulledby)
if (mob.buckled)
if(istype(mob.buckled, /obj/vehicle))
//manually set move_delay for vehicles so we don't inherit any mob movement penalties
//specific vehicle move delays are set in code\modules\vehicles\vehicle.dm
@@ -280,19 +292,22 @@
if(istype(mob.loc, /turf/space)) // Wheelchair driving!
return // No wheelchair driving in space
if(istype(mob.pulledby, /obj/structure/bed/chair/wheelchair))
return mob.pulledby.relaymove(mob, direct)
//TODO: Fuck wheelchairs.
//Toss away all this snowflake code here, and rewrite wheelchairs as a vehicle.
else if(istype(mob.buckled, /obj/structure/bed/chair/wheelchair))
var/min_move_delay = 0
if(ishuman(mob.buckled))
var/mob/living/carbon/human/driver = mob.buckled
var/obj/item/organ/external/l_hand = driver.get_organ("l_hand")
var/obj/item/organ/external/r_hand = driver.get_organ("r_hand")
if((!l_hand || l_hand.is_stump()) && (!r_hand || r_hand.is_stump()))
return // No hands to drive your chair? Tough luck!
min_move_delay = driver.min_walk_delay
//drunk wheelchair driving
if(mob.confused && prob(20))
direct = pick(cardinal)
move_delay += 2
move_delay += max((mob.movement_delay() + config.walk_speed) * config.walk_delay_multiplier, min_move_delay)
return mob.buckled.relaymove(mob,direct)
var/tally = mob.movement_delay() + config.walk_speed
@@ -321,6 +336,13 @@
if(mob.machine.relaymove(mob,direct))
return
//Wheelchair pushing goes here for now.
//TODO: Fuck wheelchairs.
if(istype(mob.pulledby, /obj/structure/bed/chair/wheelchair))
move_delay += 1
return mob.pulledby.relaymove(mob, direct)
//We are now going to move
moving = 1
+4
View File
@@ -756,7 +756,11 @@ Note that amputating the affected organ does in fact remove the infection from t
switch(disintegrate)
if(DROPLIMB_EDGE)
// compile_icon() used to be here, but it's causing issues, so RIP.
add_blood(victim)
var/matrix/M = matrix()
M.Turn(rand(180))
src.transform = M
if(!clean)
//Throw limb around.
if(src && istype(loc,/turf))
+94 -21
View File
@@ -1,9 +1,8 @@
var/list/obj/machinery/photocopier/faxmachine/allfaxes = list()
var/list/admin_departments = list("[boss_name]", "Sol Government", "Supply")
var/list/alldepartments = list()
var/list/arrived_faxes = list() //cache for faxes that have been sent to the admins
var/list/sent_faxes = list() //cache for faxes that have been sent by the admins
var/list/alldepartments = list()
var/list/admin_departments = list("[boss_name]", "Sol Government", "Supply")
/obj/machinery/photocopier/faxmachine
name = "fax machine"
@@ -16,9 +15,18 @@ var/list/sent_faxes = list() //cache for faxes that have been sent by the admins
idle_power_usage = 30
active_power_usage = 200
var/static/const/adminfax_cooldown = 1800 // in 1/10 seconds
var/static/const/normalfax_cooldown = 300
var/static/const/broadcastfax_cooldown = 3000
var/static/const/broadcast_departments = "Stationwide broadcast (WARNING)"
var/static/list/admin_departments = list("Central Command", "Sol Government")
var/obj/item/weapon/card/id/scan = null // identification
var/authenticated = 0
var/sendcooldown = 0 // to avoid spamming fax messages
var/sendtime = 0 // Time when fax was sent
var/sendcooldown = 0 // Delay, before another fax can be sent (in 1/10 second). Used by set_cooldown() and get_remaining_cooldown()
var/department = "Unknown" // our department
var/destination = null // the department we're sending to
@@ -58,7 +66,7 @@ var/list/sent_faxes = list() //cache for faxes that have been sent by the admins
dat += "<a href='byond://?src=\ref[src];remove=1'>Remove Item</a><br><br>"
if(sendcooldown)
dat += "<b>Transmitter arrays realigning. Please stand by.</b><br>"
dat += "<b>Transmitter arrays realigning. Please stand by. [round(get_remaining_cooldown() / 10)] seconds remaining.</b><br>"
else
@@ -69,7 +77,7 @@ var/list/sent_faxes = list() //cache for faxes that have been sent by the admins
else
if(sendcooldown)
dat += "Please insert paper to send via secure connection.<br><br>"
dat += "<b>Transmitter arrays realigning. Please stand by.</b><br>"
dat += "<b>Transmitter arrays realigning. Please stand by. [round(get_remaining_cooldown() / 10)] seconds remaining.</b><br>"
else
dat += "Please insert paper to send via secure connection.<br><br>"
@@ -89,19 +97,30 @@ var/list/sent_faxes = list() //cache for faxes that have been sent by the admins
user << browse(dat, "window=copier")
onclose(user, "copier")
if (sendcooldown != 0)
spawn(50)
// Auto-refresh every 5 seconds, if cooldown is active
updateUsrDialog()
return
/obj/machinery/photocopier/faxmachine/Topic(href, href_list)
if(href_list["send"])
if (sendcooldown > 0)
// Rate-limit sending faxes
usr << "<span class='warning'>The fax machine isn't ready, yet!</span>"
updateUsrDialog()
return
if(copyitem)
if (destination in admin_departments)
send_admin_fax(usr, destination)
else if (destination == broadcast_departments)
send_broadcast_fax()
else
sendfax(destination)
if (sendcooldown)
spawn(sendcooldown) // cooldown time
sendcooldown = 0
updateUsrDialog()
else if(href_list["remove"])
if(copyitem)
@@ -133,7 +152,7 @@ var/list/sent_faxes = list() //cache for faxes that have been sent by the admins
if(href_list["dept"])
var/lastdestination = destination
destination = input(usr, "Which department?", "Choose a department", "") as null|anything in (alldepartments + admin_departments)
destination = input(usr, "Which department?", "Choose a department", "") as null|anything in (alldepartments + admin_departments + broadcast_departments)
if(!destination) destination = lastdestination
if(href_list["auth"])
@@ -166,9 +185,44 @@ var/list/sent_faxes = list() //cache for faxes that have been sent by the admins
updateUsrDialog()
/obj/machinery/photocopier/faxmachine/proc/sendfax(var/destination)
/obj/machinery/photocopier/faxmachine/process()
.=..()
/var/static/ui_update_delay = 0
var/current_time = world.time
if (current_time > sendtime + sendcooldown)
sendcooldown = 0
/*
* Set the send cooldown
* cooldown: duration in ~1/10s
*/
/obj/machinery/photocopier/faxmachine/proc/set_cooldown(var/cooldown)
// Reset send time
sendtime = world.time
// Set cooldown length
sendcooldown = cooldown
/*
* Get remaining cooldown duration in ~1/10s
*/
/obj/machinery/photocopier/faxmachine/proc/get_remaining_cooldown()
var/remaining_time = (sendtime + sendcooldown) - world.time
if ((remaining_time < 0) || (sendcooldown == 0))
// Time is up, but Process() hasn't caught up, yet
// or no cooldown has been set
remaining_time = 0
return remaining_time
/*
* Send normal fax message to on-station fax machine
* destination: (string) from /allfaxes
* display_message: (bool) 1=display info text, 0="silent mode"
*/
/obj/machinery/photocopier/faxmachine/proc/sendfax(var/destination, var/display_message = 1)
if(stat & (BROKEN|NOPOWER))
return
return 0
use_power(200)
@@ -177,11 +231,14 @@ var/list/sent_faxes = list() //cache for faxes that have been sent by the admins
if( F.department == destination )
success = F.recievefax(copyitem)
if (success)
visible_message("[src] beeps, \"Message transmitted successfully.\"")
//sendcooldown = 600
else
visible_message("[src] beeps, \"Error transmitting message.\"")
if (display_message)
// Normal fax
if (success)
visible_message("[src] beeps, \"Message transmitted successfully.\"")
sendcooldown = normalfax_cooldown
else
visible_message("[src] beeps, \"Error transmitting message.\"")
return success
/obj/machinery/photocopier/faxmachine/proc/recievefax(var/obj/item/incoming)
if(stat & (BROKEN|NOPOWER))
@@ -209,6 +266,22 @@ var/list/sent_faxes = list() //cache for faxes that have been sent by the admins
return 1
/obj/machinery/photocopier/faxmachine/proc/send_broadcast_fax()
var success = 1
for (var/dest in (alldepartments - department))
// Send to everyone except this department
delay(1)
success &= sendfax(dest, 0) // 0: don't display success/error messages
if(!success)// Stop on first error
break
if (success)
visible_message("[src] beeps, \"Messages transmitted successfully.\"")
set_cooldown(broadcastfax_cooldown)
else
visible_message("[src] beeps, \"Error transmitting messages.\"")
set_cooldown(normalfax_cooldown)
/obj/machinery/photocopier/faxmachine/proc/send_admin_fax(var/mob/sender, var/destination)
if(stat & (BROKEN|NOPOWER))
return
@@ -237,9 +310,9 @@ var/list/sent_faxes = list() //cache for faxes that have been sent by the admins
message_admins(sender, "SOL GOVERNMENT FAX", rcvdcopy, "CentcommFaxReply", "#1F66A0")
//message_admins(sender, "SOL GOVERNMENT FAX", rcvdcopy, "SolGovFaxReply", "#1F66A0")
sendcooldown = 1800
sleep(50)
visible_message("[src] beeps, \"Message transmitted successfully.\"")
set_cooldown(adminfax_cooldown)
spawn(50)
visible_message("[src] beeps, \"Message transmitted successfully.\"")
/obj/machinery/photocopier/faxmachine/proc/message_admins(var/mob/sender, var/faxname, var/obj/item/sent, var/reply_type, font_colour="#006100")
@@ -66,9 +66,8 @@
..()
/obj/item/weapon/reagent_containers/blood/examine(mob/user, distance = 2)
..()
if (vampire_marks)
user << "<span='notice'>There are teeth marks on it.</span>"
if (..() && vampire_marks)
user << "<span class='warning'>There are teeth marks on it.</span>"
return
/obj/item/weapon/reagent_containers/blood/attackby(obj/item/weapon/P as obj, mob/user as mob)
@@ -1677,7 +1677,7 @@
afterattack(obj/O as obj, var/mob/living/carbon/human/user as mob, proximity)
if(!proximity) return
if(istype(O,/obj/structure/sink) && !wrapped)
if(( istype(O, /obj/structure/reagent_dispensers/watertank) || istype(O,/obj/structure/sink) ) && !wrapped)
user << "You place \the [name] under a stream of water..."
if(istype(user))
user.unEquip(src)
+10 -7
View File
@@ -6,7 +6,7 @@
on = 0
powered = 1
locked = 0
move_speed = 3
load_item_visible = 1
load_offset_x = 0
mob_offset_y = 7
@@ -29,7 +29,7 @@
anchored = 0
passenger_allowed = 0
locked = 0
//move_speed = 3
load_item_visible = 1
load_offset_x = 0
load_offset_y = 4
@@ -352,12 +352,15 @@
/obj/vehicle/train/cargo/engine/update_car(var/train_length, var/active_engines)
src.train_length = train_length
src.active_engines = active_engines
move_speed = initial(move_speed) //so that engines that have been turned off don't lag behind
//Update move delay
if(is_train_head() && on)
var/remainder = (car_limit * active_engines) - (train_length - active_engines)
if (remainder)
move_speed -= 0.25 * remainder //makes cargo trains 10% slower than running when not overweight
if(!is_train_head() || !on)
move_delay = initial(move_delay) //so that engines that have been turned off don't lag behind
else
move_delay = max(0, (-car_limit * active_engines) + train_length - active_engines) //limits base overweight so you cant overspeed trains
move_delay *= (1 / max(1, active_engines)) * 2 //overweight penalty (scaled by the number of engines)
move_delay += config.walk_speed //base reference speed
move_delay *= config.vehicle_delay_multiplier //makes cargo trains 10% slower than running when not overweight
/obj/vehicle/train/cargo/trolley/update_car(var/train_length, var/active_engines)
src.train_length = train_length
+3 -8
View File
@@ -2,6 +2,7 @@
name = "train"
dir = 4
move_delay = 1
health = 100
maxhealth = 100
@@ -28,19 +29,13 @@
var/old_loc = get_turf(src)
if(..())
if(tow)
tow.forceMove(old_loc)
tow.Move(old_loc)
return 1
else
if(lead)
unattach()
return 0
obj/vehicle/train/forceMove()
var/old_loc = get_turf(src)
..()
if(tow)
tow.forceMove(old_loc)
/obj/vehicle/train/Bump(atom/Obstacle)
if(!istype(Obstacle, /atom/movable))
return
@@ -56,7 +51,7 @@ obj/vehicle/train/forceMove()
var/mob/living/M = A
visible_message("\red [src] knocks over [M]!")
M.apply_effects(5, 5) //knock people down if you hit them
M.apply_damages(10 * move_speed) // and do damage according to how fast the train is going
M.apply_damages(22 / move_delay) // and do damage according to how fast the train is going
if(istype(load, /mob/living/carbon/human))
var/mob/living/D = load
D << "\red You hit [M]!"
+8 -21
View File
@@ -28,10 +28,7 @@
var/stat = 0
var/emagged = 0
var/powered = 0 //set if vehicle is powered and should use fuel when moving
move_speed = 2//Expressed in tiles per second. This is used to control how fast the vehicle moves
var/move_delay//DO NOT MANUALLY SET THIS. For internal use only
var/move_delay = 1 //set this to limit the speed of the vehicle
var/obj/item/weapon/cell/cell
var/charge_use = 5 //set this to adjust the amount of power the vehicle uses per move
@@ -48,22 +45,8 @@
/obj/vehicle/New()
..()
//spawn the cell you want in each vehicle
calc_delay()
/obj/vehicle/proc/calc_delay()
if (!move_speed || move_speed < 0)//Shouldn't happen
move_speed = 0
move_delay = 999999999
return 0
move_delay = (1 / move_speed) * 10 * config.vehicle_delay_multiplier
return 1
/obj/vehicle/Move()
if (!move_speed)
return 0
if(world.time > l_move_time + move_delay)
var/old_loc = get_turf(src)
if(on && powered && cell.charge < charge_use)
@@ -188,7 +171,6 @@
// Vehicle procs
//-------------------------------------------
/obj/vehicle/proc/turn_on()
calc_delay()
if(stat)
return 0
if(powered && cell.charge < charge_use)
@@ -318,7 +300,6 @@
if(ismob(C))
buckle_mob(C)
calc_delay()
return 1
/obj/vehicle/user_unbuckle_mob(var/mob/user)
@@ -366,9 +347,15 @@
unbuckle_mob(load)
load = null
calc_delay()
return 1
// This exists to stop a weird jumping motion when you disembark.
// It essentially makes disembarkation count as a movement.
// Yes, it's not the full calculation. But it's relatively close, and will make it seamless.
/obj/vehicle/post_buckle_mob(var/mob/M)
if (M.client)
M.client.move_delay = M.movement_delay() + config.walk_speed
//-------------------------------------------------------
// Stat update procs
+1
View File
@@ -5,6 +5,7 @@ var/list/ventcrawl_machinery = list(
// Vent crawling whitelisted items, whoo
/mob/living/var/list/can_enter_vent_with = list(
/obj/item/device/mmi,
/obj/item/weapon/implant,
/obj/item/device/radio/borg,
/obj/item/weapon/holder,
@@ -51,10 +51,10 @@
else
if((direction & initialize_directions) || is_type_in_list(src, ventcrawl_machinery) && src.can_crawl_through()) //if we move in a way the pipe can connect, but doesn't - or we're in a vent
user.remove_ventcrawl()
user.forceMove(src.loc)
user.forceMove(check_neighbor_density(get_turf(src.loc), direction) ? src.loc : get_step(src, direction))
user.sight &= ~(SEE_TURFS|BLIND)
user.visible_message("<span class='warning'>You hear something squeezing through the pipes.</span>", "You climb out the ventilation system.")
user.vent_trap_check("arriving", target_move)
user.vent_trap_check("arriving", user.loc)
user.canmove = 0
spawn(1)
user.canmove = 1
+1 -6
View File
@@ -1091,11 +1091,6 @@ var/list/be_special_flags = list(
#define RESPAWN_ANIMAL 3000
#define RESPAWN_MINISYNTH 6000
// Night lighting controller times
// The time (in ticks based on worldtime2ticks()) that various actions trigger
#define MORNING_LIGHT_RESET 252000 // 7am or 07:00 - lighting restores to normal in morning
#define NIGHT_LIGHT_ACTIVE 648000 // 6pm or 18:00 - night lighting mode activates
//Cargo random stock vars
//These are used in randomstock.dm
//And also for generating random loot crates in crates.dm
@@ -1105,7 +1100,7 @@ var/list/be_special_flags = list(
#define STOCK_UNCOMMON_PROB 23
//The probability, as a percentage for each item, that we'll choose from the uncommon spawns list
#define STOCK_RARE_PROB 2.8
#define STOCK_RARE_PROB 2.4
//The probability, as a percentage for each item, that we'll choose from the rare spawns list
//If an item is not rare or uncommon, it will be chosen from the common spawns list.