mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 10:21:11 +00:00
The winter update, part 2-2
This commit is contained in:
@@ -5,6 +5,78 @@
|
|||||||
// END_INTERNALS
|
// END_INTERNALS
|
||||||
// BEGIN_FILE_DIR
|
// BEGIN_FILE_DIR
|
||||||
#define FILE_DIR .
|
#define FILE_DIR .
|
||||||
|
#define FILE_DIR "code"
|
||||||
|
#define FILE_DIR "code/libs"
|
||||||
|
#define FILE_DIR "code/libs/Get Flat Icon"
|
||||||
|
#define FILE_DIR "code/libs/Get Flat Icon/demo"
|
||||||
|
#define FILE_DIR "code/TriDimension"
|
||||||
|
#define FILE_DIR "code/unused"
|
||||||
|
#define FILE_DIR "code/unused/goonheist"
|
||||||
|
#define FILE_DIR "code/WorkInProgress"
|
||||||
|
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn"
|
||||||
|
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Rust"
|
||||||
|
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/ShieldGen"
|
||||||
|
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Supermatter"
|
||||||
|
#define FILE_DIR "code/WorkInProgress/Susan"
|
||||||
|
#define FILE_DIR "html"
|
||||||
|
#define FILE_DIR "icons"
|
||||||
|
#define FILE_DIR "icons/48x48"
|
||||||
|
#define FILE_DIR "icons/adminbus"
|
||||||
|
#define FILE_DIR "icons/ass"
|
||||||
|
#define FILE_DIR "icons/effects"
|
||||||
|
#define FILE_DIR "icons/mecha"
|
||||||
|
#define FILE_DIR "icons/misc"
|
||||||
|
#define FILE_DIR "icons/mob"
|
||||||
|
#define FILE_DIR "icons/mob/custom"
|
||||||
|
#define FILE_DIR "icons/mob/custom/N3X15"
|
||||||
|
#define FILE_DIR "icons/mob/human_races"
|
||||||
|
#define FILE_DIR "icons/mob/in-hand"
|
||||||
|
#define FILE_DIR "icons/mob/in-hand/left"
|
||||||
|
#define FILE_DIR "icons/mob/in-hand/right"
|
||||||
|
#define FILE_DIR "icons/mob/species"
|
||||||
|
#define FILE_DIR "icons/mob/species/vox"
|
||||||
|
#define FILE_DIR "icons/obj"
|
||||||
|
#define FILE_DIR "icons/obj/assemblies"
|
||||||
|
#define FILE_DIR "icons/obj/atmospherics"
|
||||||
|
#define FILE_DIR "icons/obj/clothing"
|
||||||
|
#define FILE_DIR "icons/obj/doors"
|
||||||
|
#define FILE_DIR "icons/obj/flora"
|
||||||
|
#define FILE_DIR "icons/obj/machines"
|
||||||
|
#define FILE_DIR "icons/obj/map"
|
||||||
|
#define FILE_DIR "icons/obj/pipes"
|
||||||
|
#define FILE_DIR "icons/pda_icons"
|
||||||
|
#define FILE_DIR "icons/pods"
|
||||||
|
#define FILE_DIR "icons/spideros_icons"
|
||||||
|
#define FILE_DIR "icons/splashworks"
|
||||||
|
#define FILE_DIR "icons/Testing"
|
||||||
|
#define FILE_DIR "icons/turf"
|
||||||
|
#define FILE_DIR "icons/vending_icons"
|
||||||
|
#define FILE_DIR "icons/xenoarch_icons"
|
||||||
|
#define FILE_DIR "nano"
|
||||||
|
#define FILE_DIR "nano/images"
|
||||||
|
#define FILE_DIR "sound"
|
||||||
|
#define FILE_DIR "sound/AI"
|
||||||
|
#define FILE_DIR "sound/ambience"
|
||||||
|
#define FILE_DIR "sound/effects"
|
||||||
|
#define FILE_DIR "sound/effects/turret"
|
||||||
|
#define FILE_DIR "sound/effects/wind"
|
||||||
|
#define FILE_DIR "sound/hallucinations"
|
||||||
|
#define FILE_DIR "sound/items"
|
||||||
|
#define FILE_DIR "sound/machines"
|
||||||
|
#define FILE_DIR "sound/mecha"
|
||||||
|
#define FILE_DIR "sound/misc"
|
||||||
|
#define FILE_DIR "sound/music"
|
||||||
|
#define FILE_DIR "sound/piano"
|
||||||
|
#define FILE_DIR "sound/scp"
|
||||||
|
#define FILE_DIR "sound/violin"
|
||||||
|
#define FILE_DIR "sound/voice"
|
||||||
|
#define FILE_DIR "sound/voice/Serithi"
|
||||||
|
#define FILE_DIR "sound/vox"
|
||||||
|
#define FILE_DIR "sound/vox_fem"
|
||||||
|
#define FILE_DIR "sound/weapons"
|
||||||
|
#define FILE_DIR "tools"
|
||||||
|
#define FILE_DIR "tools/AddToChangelog"
|
||||||
|
#define FILE_DIR "tools/AddToChangelog/AddToChangelog"
|
||||||
// END_FILE_DIR
|
// END_FILE_DIR
|
||||||
// BEGIN_PREFERENCES
|
// BEGIN_PREFERENCES
|
||||||
#define DEBUG
|
#define DEBUG
|
||||||
@@ -276,6 +348,7 @@
|
|||||||
#include "code\game\gamemodes\events\biomass.dm"
|
#include "code\game\gamemodes\events\biomass.dm"
|
||||||
#include "code\game\gamemodes\events\black_hole.dm"
|
#include "code\game\gamemodes\events\black_hole.dm"
|
||||||
#include "code\game\gamemodes\events\clang.dm"
|
#include "code\game\gamemodes\events\clang.dm"
|
||||||
|
#include "code\game\gamemodes\events\cosmic_freeze.dm"
|
||||||
#include "code\game\gamemodes\events\dust.dm"
|
#include "code\game\gamemodes\events\dust.dm"
|
||||||
#include "code\game\gamemodes\events\miniblob.dm"
|
#include "code\game\gamemodes\events\miniblob.dm"
|
||||||
#include "code\game\gamemodes\events\ninja_abilities.dm"
|
#include "code\game\gamemodes\events\ninja_abilities.dm"
|
||||||
@@ -708,6 +781,7 @@
|
|||||||
#include "code\game\objects\structures\noticeboard.dm"
|
#include "code\game\objects\structures\noticeboard.dm"
|
||||||
#include "code\game\objects\structures\safe.dm"
|
#include "code\game\objects\structures\safe.dm"
|
||||||
#include "code\game\objects\structures\signs.dm"
|
#include "code\game\objects\structures\signs.dm"
|
||||||
|
#include "code\game\objects\structures\snow.dm"
|
||||||
#include "code\game\objects\structures\support_rail.dm"
|
#include "code\game\objects\structures\support_rail.dm"
|
||||||
#include "code\game\objects\structures\tables_racks.dm"
|
#include "code\game\objects\structures\tables_racks.dm"
|
||||||
#include "code\game\objects\structures\tank_dispenser.dm"
|
#include "code\game\objects\structures\tank_dispenser.dm"
|
||||||
@@ -1244,6 +1318,7 @@
|
|||||||
#include "code\modules\mob\living\simple_animal\hostile\retaliate\cluwne.dm"
|
#include "code\modules\mob\living\simple_animal\hostile\retaliate\cluwne.dm"
|
||||||
#include "code\modules\mob\living\simple_animal\hostile\retaliate\drone.dm"
|
#include "code\modules\mob\living\simple_animal\hostile\retaliate\drone.dm"
|
||||||
#include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm"
|
#include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm"
|
||||||
|
#include "code\modules\mob\living\simple_animal\hostile\retaliate\snowman.dm"
|
||||||
#include "code\modules\mob\new_player\login.dm"
|
#include "code\modules\mob\new_player\login.dm"
|
||||||
#include "code\modules\mob\new_player\logout.dm"
|
#include "code\modules\mob\new_player\logout.dm"
|
||||||
#include "code\modules\mob\new_player\new_player.dm"
|
#include "code\modules\mob\new_player\new_player.dm"
|
||||||
|
|||||||
@@ -136,6 +136,9 @@
|
|||||||
/atom/proc/singuloCanEat()
|
/atom/proc/singuloCanEat()
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
/atom/proc/freeze()
|
||||||
|
return
|
||||||
|
|
||||||
/atom/proc/bullet_act(var/obj/item/projectile/Proj)
|
/atom/proc/bullet_act(var/obj/item/projectile/Proj)
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|||||||
15
code/game/gamemodes/events/cosmic_freeze.dm
Normal file
15
code/game/gamemodes/events/cosmic_freeze.dm
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
/proc/cosmic_freeze_event()
|
||||||
|
|
||||||
|
spawn() //to stop the secrets panel hanging
|
||||||
|
var/list/turf/simulated/floor/turfs = list()
|
||||||
|
for(var/areapath in typesof(/area/hallway,/area/crew_quarters,/area/maintenance))
|
||||||
|
var/area/A = locate(areapath)
|
||||||
|
for(var/area/B in A.related)
|
||||||
|
for(var/turf/simulated/floor/F in B.contents)
|
||||||
|
if(!F.contents.len)
|
||||||
|
turfs += F
|
||||||
|
|
||||||
|
if(turfs.len) //Pick a turf to spawn at if we can
|
||||||
|
var/turf/simulated/floor/T = pick(turfs)
|
||||||
|
new/obj/structure/snow/cosmic(T)
|
||||||
|
message_admins("\blue Event: Cosmic snow spawned at [T.loc] ([T.x],[T.y],[T.z])")
|
||||||
@@ -181,15 +181,21 @@
|
|||||||
|
|
||||||
|
|
||||||
/obj/machinery/alarm/process()
|
/obj/machinery/alarm/process()
|
||||||
|
var/turf/simulated/location = loc
|
||||||
|
if(!istype(location)) return//returns if loc is not simulated
|
||||||
|
var/datum/gas_mixture/environment = location.return_air()
|
||||||
|
|
||||||
|
if(stat & (FROZEN))
|
||||||
|
if(environment.temperature >= 300)
|
||||||
|
visible_message("The ice on \the [src] melts away. it should be operational once again.")
|
||||||
|
stat &= ~FROZEN
|
||||||
|
update_icon()
|
||||||
|
return
|
||||||
|
|
||||||
if((stat & (NOPOWER|BROKEN)) || shorted || buildstage != 2)
|
if((stat & (NOPOWER|BROKEN)) || shorted || buildstage != 2)
|
||||||
use_power = 0
|
use_power = 0
|
||||||
return
|
return
|
||||||
|
|
||||||
var/turf/simulated/location = loc
|
|
||||||
if(!istype(location)) return//returns if loc is not simulated
|
|
||||||
|
|
||||||
var/datum/gas_mixture/environment = location.return_air()
|
|
||||||
|
|
||||||
// Handle temperature adjustment here.
|
// Handle temperature adjustment here.
|
||||||
if(environment.temperature < target_temperature - 2 || environment.temperature > target_temperature + 2 || regulating_temperature)
|
if(environment.temperature < target_temperature - 2 || environment.temperature > target_temperature + 2 || regulating_temperature)
|
||||||
//If it goes too far, we should adjust ourselves back before stopping.
|
//If it goes too far, we should adjust ourselves back before stopping.
|
||||||
@@ -313,9 +319,14 @@
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
/obj/machinery/alarm/update_icon()
|
/obj/machinery/alarm/update_icon()
|
||||||
|
overlays = 0
|
||||||
|
if(stat & FROZEN)
|
||||||
|
overlays += image(icon,"alarmf")
|
||||||
|
|
||||||
if(wiresexposed)
|
if(wiresexposed)
|
||||||
icon_state = "alarmx"
|
icon_state = "alarmx"
|
||||||
return
|
return
|
||||||
|
|
||||||
if((stat & (NOPOWER|BROKEN)) || shorted)
|
if((stat & (NOPOWER|BROKEN)) || shorted)
|
||||||
icon_state = "alarmp"
|
icon_state = "alarmp"
|
||||||
return
|
return
|
||||||
@@ -644,6 +655,10 @@
|
|||||||
|
|
||||||
|
|
||||||
/obj/machinery/alarm/interact(mob/user)
|
/obj/machinery/alarm/interact(mob/user)
|
||||||
|
if(stat & FROZEN)
|
||||||
|
user << "If only you could somehow melt the ice covering the alarm's interface..."
|
||||||
|
return
|
||||||
|
|
||||||
user.set_machine(src)
|
user.set_machine(src)
|
||||||
|
|
||||||
if(buildstage!=2)
|
if(buildstage!=2)
|
||||||
@@ -830,6 +845,24 @@
|
|||||||
*/
|
*/
|
||||||
src.add_fingerprint(user)
|
src.add_fingerprint(user)
|
||||||
|
|
||||||
|
if(stat & FROZEN)
|
||||||
|
if(istype(W, /obj/item/weapon/weldingtool))
|
||||||
|
var/obj/item/weapon/weldingtool/WT = W
|
||||||
|
if(!WT.isOn()) return
|
||||||
|
if (WT.get_fuel() < 5) // uses up 5 fuel.
|
||||||
|
user << "<span class='warning'>You need more fuel to complete this task.</span>"
|
||||||
|
return
|
||||||
|
|
||||||
|
user << "You begin melting the ice on \the [src]."
|
||||||
|
playsound(get_turf(src), pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1)
|
||||||
|
if(do_after(user, 50))
|
||||||
|
if(!src || !WT.remove_fuel(5, user)) return
|
||||||
|
user << "You melt the ice. \the [src] should be operational once again."
|
||||||
|
stat &= ~FROZEN
|
||||||
|
update_icon()
|
||||||
|
|
||||||
|
return ..()
|
||||||
|
|
||||||
switch(buildstage)
|
switch(buildstage)
|
||||||
if(2)
|
if(2)
|
||||||
if(istype(W, /obj/item/weapon/screwdriver)) // Opening that Air Alarm up.
|
if(istype(W, /obj/item/weapon/screwdriver)) // Opening that Air Alarm up.
|
||||||
|
|||||||
@@ -133,6 +133,7 @@
|
|||||||
/obj/item/clothing/tie/horrible,
|
/obj/item/clothing/tie/horrible,
|
||||||
/obj/item/device/maracas,
|
/obj/item/device/maracas,
|
||||||
/obj/item/weapon/gun/energy/temperature,
|
/obj/item/weapon/gun/energy/temperature,
|
||||||
|
/obj/item/weapon/shovel/spade,
|
||||||
)
|
)
|
||||||
|
|
||||||
var/obj/item/I = new gift_type(M)
|
var/obj/item/I = new gift_type(M)
|
||||||
@@ -143,6 +144,7 @@
|
|||||||
qdel(src)
|
qdel(src)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
//christmas and festive food
|
||||||
/obj/item/weapon/winter_gift/food/attack_self(mob/M as mob)
|
/obj/item/weapon/winter_gift/food/attack_self(mob/M as mob)
|
||||||
var/gift_type = pick(
|
var/gift_type = pick(
|
||||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake,
|
/obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake,
|
||||||
@@ -158,10 +160,18 @@
|
|||||||
qdel(src)
|
qdel(src)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
//warm clothes
|
||||||
/obj/item/weapon/winter_gift/cloth/attack_self(mob/M as mob)
|
/obj/item/weapon/winter_gift/cloth/attack_self(mob/M as mob)
|
||||||
|
if(prob(30))
|
||||||
|
cloth_bundle()
|
||||||
|
M << "<span class='notice'>You unwrapped a bundle of clothes! Looks comfy!</span>"
|
||||||
|
qdel(src)
|
||||||
|
return
|
||||||
|
|
||||||
var/gift_type = pick(
|
var/gift_type = pick(
|
||||||
/obj/item/clothing/gloves/black,
|
/obj/item/clothing/gloves/black,
|
||||||
/obj/item/clothing/head/ushanka,
|
/obj/item/clothing/head/ushanka,
|
||||||
|
/obj/item/clothing/head/bearpelt,
|
||||||
)
|
)
|
||||||
|
|
||||||
var/obj/item/I = new gift_type(M)
|
var/obj/item/I = new gift_type(M)
|
||||||
@@ -172,6 +182,40 @@
|
|||||||
qdel(src)
|
qdel(src)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
/obj/item/weapon/winter_gift/cloth/proc/cloth_bundle()
|
||||||
|
var/bundle = pick(
|
||||||
|
3;"batman",
|
||||||
|
10;"russian fur",
|
||||||
|
10;"chicken",
|
||||||
|
8;"pirate captain",
|
||||||
|
2;"cuban pete"
|
||||||
|
)
|
||||||
|
|
||||||
|
switch(bundle)
|
||||||
|
if("batman")
|
||||||
|
new /obj/item/weapon/storage/belt/security/batmanbelt(get_turf(loc))
|
||||||
|
new /obj/item/clothing/head/batman(get_turf(loc))
|
||||||
|
new /obj/item/clothing/gloves/batmangloves(get_turf(loc))
|
||||||
|
new /obj/item/clothing/shoes/jackboots/batmanboots(get_turf(loc))
|
||||||
|
new /obj/item/clothing/under/batmansuit(get_turf(loc))
|
||||||
|
if("russian fur")
|
||||||
|
new /obj/item/clothing/suit/russofurcoat(get_turf(loc))
|
||||||
|
new /obj/item/clothing/head/russofurhat(get_turf(loc))
|
||||||
|
if("chicken")
|
||||||
|
new /obj/item/clothing/head/chicken(get_turf(loc))
|
||||||
|
new /obj/item/clothing/suit/chickensuit(get_turf(loc))
|
||||||
|
if("pirate captain")
|
||||||
|
new /obj/item/clothing/glasses/eyepatch(get_turf(loc))
|
||||||
|
new /obj/item/clothing/head/hgpiratecap(get_turf(loc))
|
||||||
|
new /obj/item/clothing/suit/hgpirate(get_turf(loc))
|
||||||
|
new /obj/item/clothing/under/captain_fly(get_turf(loc))
|
||||||
|
new /obj/item/clothing/shoes/jackboots(get_turf(loc))
|
||||||
|
if("cuban pete")
|
||||||
|
new /obj/item/clothing/head/collectable/petehat(get_turf(loc))
|
||||||
|
new /obj/item/device/maracas(get_turf(loc))
|
||||||
|
new /obj/item/device/maracas(get_turf(loc))
|
||||||
|
|
||||||
|
//dangerous items
|
||||||
/obj/item/weapon/winter_gift/special/attack_self(mob/M as mob)
|
/obj/item/weapon/winter_gift/special/attack_self(mob/M as mob)
|
||||||
var/gift_type = pick(
|
var/gift_type = pick(
|
||||||
/obj/item/device/fuse_bomb,
|
/obj/item/device/fuse_bomb,
|
||||||
@@ -205,6 +249,16 @@
|
|||||||
qdel(src)
|
qdel(src)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
//black gifts have 2% chance to spawn by default.
|
||||||
|
/obj/item/weapon/winter_gift/proc/pick_a_gift(var/turf/T,var/special_chance = 2)
|
||||||
|
var/gift_type = pick(
|
||||||
|
50;/obj/item/weapon/winter_gift/regular,
|
||||||
|
25;/obj/item/weapon/winter_gift/food,
|
||||||
|
25;/obj/item/weapon/winter_gift/cloth,
|
||||||
|
special_chance;/obj/item/weapon/winter_gift/special,
|
||||||
|
)
|
||||||
|
new gift_type(T)
|
||||||
|
|
||||||
////STRANGE PRESENTS(wrapped people)////
|
////STRANGE PRESENTS(wrapped people)////
|
||||||
|
|
||||||
/obj/effect/spresent
|
/obj/effect/spresent
|
||||||
|
|||||||
535
code/game/objects/structures/snow.dm
Normal file
535
code/game/objects/structures/snow.dm
Normal file
@@ -0,0 +1,535 @@
|
|||||||
|
//////SNOW//////(winter 2014, by Deity Link)
|
||||||
|
|
||||||
|
/obj/structure/snow
|
||||||
|
name = "snow"
|
||||||
|
layer = 2.5//above the plating and the vents, bellow most items and structures
|
||||||
|
icon = 'icons/turf/snow.dmi'
|
||||||
|
icon_state = "snow"
|
||||||
|
alpha = 230
|
||||||
|
anchored = 1
|
||||||
|
density = 0
|
||||||
|
mouse_opacity = 1
|
||||||
|
|
||||||
|
var/dug = 0
|
||||||
|
|
||||||
|
var/list/foliage = list(
|
||||||
|
"snowgrass1bb",
|
||||||
|
"snowgrass2bb",
|
||||||
|
"snowgrass3bb",
|
||||||
|
"snowgrass1gb",
|
||||||
|
"snowgrass2gb",
|
||||||
|
"snowgrass3gb",
|
||||||
|
"snowgrassall1",
|
||||||
|
"snowgrassall2",
|
||||||
|
"snowgrassall3",
|
||||||
|
)
|
||||||
|
|
||||||
|
/obj/structure/snow/New()
|
||||||
|
..()
|
||||||
|
if(prob(17))
|
||||||
|
overlays += image('icons/obj/flora/snowflora.dmi',pick(foliage))
|
||||||
|
|
||||||
|
/obj/structure/snow/attackby(obj/item/W,mob/user)
|
||||||
|
if(istype(W,/obj/item/weapon/shovel))//using a shovel or spade harvests some snow and let's you click on the lower layers
|
||||||
|
if(dug < 2)
|
||||||
|
dug = 2
|
||||||
|
icon_state = "snow_dug"
|
||||||
|
mouse_opacity = 0
|
||||||
|
new /obj/item/stack/sheet/snow(get_turf(src), 1)
|
||||||
|
new /obj/item/stack/sheet/snow(get_turf(src), 1)
|
||||||
|
new /obj/item/stack/sheet/snow(get_turf(src), 1)
|
||||||
|
sleep(400)
|
||||||
|
icon_state = "snow_grabbed"
|
||||||
|
dug = 1
|
||||||
|
mouse_opacity = 1
|
||||||
|
sleep(400)
|
||||||
|
if(dug != 2)
|
||||||
|
icon_state = "snow"
|
||||||
|
dug = 0
|
||||||
|
else
|
||||||
|
user << "There isn't much snow left to dig. It might come back later."
|
||||||
|
|
||||||
|
/obj/structure/snow/attack_hand(mob/user)
|
||||||
|
if(dug > 0) return
|
||||||
|
playsound(get_turf(src), "rustle", 50, 1)
|
||||||
|
user << "<span class='notice'>You start digging the snow with your hands.</span>"
|
||||||
|
if(do_after(user,30))
|
||||||
|
dug = 1
|
||||||
|
user << "<span class='notice'>You form a snowball in your hands.</span>"
|
||||||
|
user.put_in_hands(new /obj/item/stack/sheet/snow())
|
||||||
|
icon_state = "snow_grabbed"
|
||||||
|
sleep(400)
|
||||||
|
if(dug != 2)
|
||||||
|
icon_state = "snow"
|
||||||
|
dug = 0
|
||||||
|
return
|
||||||
|
|
||||||
|
//////COSMIC SNOW(the one that spreads everywhere)//////
|
||||||
|
|
||||||
|
/obj/structure/snow/cosmic
|
||||||
|
desc = "Winter is coming."
|
||||||
|
|
||||||
|
var/list/block_spread_turf = list(
|
||||||
|
/turf/space,
|
||||||
|
/turf/unsimulated,
|
||||||
|
)
|
||||||
|
|
||||||
|
var/list/block_spread_obj = list( //these objects always block the spread of the snow
|
||||||
|
/obj/structure/plasticflaps/mining,
|
||||||
|
/obj/structure/snow,
|
||||||
|
/obj/effect/forcefield,
|
||||||
|
)
|
||||||
|
|
||||||
|
var/list/block_spread_density = list( //these objects only block the spread of the snow if they are dense
|
||||||
|
/obj/machinery/door/firedoor,
|
||||||
|
/obj/machinery/door/airlock,
|
||||||
|
/obj/machinery/door/morgue,
|
||||||
|
/obj/machinery/door/poddoor,
|
||||||
|
)
|
||||||
|
|
||||||
|
var/datum/gas_mixture/env = null
|
||||||
|
|
||||||
|
/obj/structure/snow/cosmic/New()
|
||||||
|
..()
|
||||||
|
snow_tiles++
|
||||||
|
|
||||||
|
var/blocked = 0
|
||||||
|
for(var/atom/A in get_turf(src))
|
||||||
|
if(A.density)
|
||||||
|
blocked = 1
|
||||||
|
|
||||||
|
if((snow_tiles >= 200) && !blocked && prob(15))
|
||||||
|
if(prob(30))
|
||||||
|
new/obj/structure/snow_flora/sappling/pine(get_turf(src))
|
||||||
|
else
|
||||||
|
new/obj/structure/snow_flora/sappling(get_turf(src))
|
||||||
|
|
||||||
|
if((snow_tiles >= 400) && !blocked && prob(2))
|
||||||
|
new/mob/living/simple_animal/hostile/retaliate/snowman(get_turf(src))
|
||||||
|
|
||||||
|
if(!bear_invasion && (snow_tiles >= 800))
|
||||||
|
bear_invasion = 1
|
||||||
|
for(var/obj/effect/landmark/C in landmarks_list)
|
||||||
|
if(C.name == "carpspawn")
|
||||||
|
if(prob(50))
|
||||||
|
new /mob/living/simple_animal/hostile/bear(C.loc)
|
||||||
|
|
||||||
|
var/turf/simulated/TS = get_turf(src)
|
||||||
|
if(!istype(TS)) return
|
||||||
|
env = TS.return_air()
|
||||||
|
|
||||||
|
chill()
|
||||||
|
|
||||||
|
spawn(5)//so the parent snow doesn't have to wait for its children's spread to finish, to prevent some sort of gigantic recursion that only lets snow duplicate toward North.
|
||||||
|
if(src)
|
||||||
|
spread()
|
||||||
|
|
||||||
|
for(var/obj/machinery/alarm/A in get_turf(src))
|
||||||
|
A.stat |= FROZEN
|
||||||
|
A.rcon_setting = RCON_NO
|
||||||
|
A.update_icon()
|
||||||
|
|
||||||
|
/obj/structure/snow/cosmic/proc/update_env_air()
|
||||||
|
var/turf/simulated/TS = get_turf(src)
|
||||||
|
if(!istype(TS)) return
|
||||||
|
env = TS.return_air()
|
||||||
|
|
||||||
|
/obj/structure/snow/cosmic/proc/spread()
|
||||||
|
update_env_air()
|
||||||
|
|
||||||
|
if(!env) return
|
||||||
|
|
||||||
|
if(env.temperature > MELTPOINT_SNOW)//above 30<33>C, the snow melts away)
|
||||||
|
var/turf/simulated/TS = get_turf(src)
|
||||||
|
if(!istype(TS)) return
|
||||||
|
TS.wet(800)
|
||||||
|
snow_tiles--
|
||||||
|
qdel(src)
|
||||||
|
return
|
||||||
|
|
||||||
|
if(env.temperature < 296.15)//the cosmic snow only spreads when the temperature is bellow 23<32>C
|
||||||
|
|
||||||
|
for(var/i in cardinal)
|
||||||
|
var/turf/T = get_step(src,i)
|
||||||
|
|
||||||
|
if(is_type_in_list(T,block_spread_turf))
|
||||||
|
continue
|
||||||
|
|
||||||
|
if(T.density)
|
||||||
|
continue //walls, duh
|
||||||
|
|
||||||
|
var/can_spread = 1
|
||||||
|
for(var/blockingA in block_spread_obj)
|
||||||
|
if(locate(blockingA) in T)
|
||||||
|
can_spread = 0
|
||||||
|
break
|
||||||
|
|
||||||
|
for(var/blockingB in block_spread_density)
|
||||||
|
var/obj/BB = (locate(blockingB) in T)
|
||||||
|
if(BB && BB.density)
|
||||||
|
can_spread = 0
|
||||||
|
break
|
||||||
|
|
||||||
|
//checking for windows and windoors on the source tile
|
||||||
|
for(var/obj/structure/window/WA in get_turf(src))
|
||||||
|
if(WA.dir & get_dir(get_turf(src),T))
|
||||||
|
can_spread = 0
|
||||||
|
break
|
||||||
|
|
||||||
|
for(var/obj/machinery/door/window/WB in get_turf(src))
|
||||||
|
if((WB.dir & get_dir(get_turf(src),T)) && WB.density)
|
||||||
|
can_spread = 0
|
||||||
|
break
|
||||||
|
|
||||||
|
//checking for windows and windoors on the destination tile
|
||||||
|
for(var/obj/structure/window/WA in T)
|
||||||
|
if(WA.is_fulltile())
|
||||||
|
can_spread = 0
|
||||||
|
break
|
||||||
|
if(WA.dir & get_dir(T,get_turf(src)))
|
||||||
|
can_spread = 0
|
||||||
|
break
|
||||||
|
|
||||||
|
for(var/obj/machinery/door/window/WB in T)
|
||||||
|
if((WB.dir & get_dir(T,get_turf(src))) && WB.density)
|
||||||
|
can_spread = 0
|
||||||
|
break
|
||||||
|
|
||||||
|
var/datum/gas_mixture/env2 = T.return_air()
|
||||||
|
|
||||||
|
if(can_spread && (env2.temperature < MELTPOINT_SNOW))
|
||||||
|
new/obj/structure/snow/cosmic(T)
|
||||||
|
|
||||||
|
spawn(5)
|
||||||
|
if(src)
|
||||||
|
spread()
|
||||||
|
|
||||||
|
/obj/structure/snow/cosmic/proc/chill()
|
||||||
|
if(env.temperature > 233)//the snow will slowly lower the temperature until -40<34>C.
|
||||||
|
env.temperature -= 0.02
|
||||||
|
|
||||||
|
spawn(20)
|
||||||
|
if(src)
|
||||||
|
chill()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//////SNOWBALLS//////
|
||||||
|
|
||||||
|
/obj/item/stack/sheet/snow
|
||||||
|
name = "snow"
|
||||||
|
desc = "Technically water."
|
||||||
|
singular_name = "snow ball"
|
||||||
|
icon_state = "snow"
|
||||||
|
melt_temperature = MELTPOINT_SNOW
|
||||||
|
force = 0
|
||||||
|
throwforce = 1
|
||||||
|
throw_speed = 3
|
||||||
|
throw_range = 6
|
||||||
|
|
||||||
|
/obj/item/stack/sheet/snow/New(var/loc, var/amount=null)
|
||||||
|
recipes = snow_recipes
|
||||||
|
pixel_x = rand(-13,13)
|
||||||
|
pixel_y = rand(-13,13)
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/obj/item/stack/sheet/snow/melt()
|
||||||
|
var/turf/T = get_turf(src)
|
||||||
|
if(istype(T,/turf/simulated))
|
||||||
|
var/turf/simulated/TS = T
|
||||||
|
TS.wet(800)
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/item/stack/sheet/snow/throw_at(atom/target, range, speed)
|
||||||
|
playsound(src.loc, 'sound/weapons/punchmiss.ogg', 50, 1)
|
||||||
|
..()
|
||||||
|
|
||||||
|
/obj/item/stack/sheet/snow/throw_impact(atom/hit_atom)
|
||||||
|
if(istype(hit_atom,/mob/living/carbon/))
|
||||||
|
var/mob/living/carbon/C = hit_atom
|
||||||
|
if(C.stuttering < 1 && (!(M_HULK in C.mutations)))
|
||||||
|
C.stuttering = 1
|
||||||
|
C.Weaken(1)
|
||||||
|
C.Stun(1)
|
||||||
|
playsound(C.loc, "swing_hit", 50, 1)
|
||||||
|
if(C.bodytemperature >= 265)
|
||||||
|
C.bodytemperature -= 5
|
||||||
|
else if(istype(hit_atom,/mob/living/simple_animal/hostile/retaliate/snowman))
|
||||||
|
var/mob/living/simple_animal/hostile/retaliate/snowman/S = hit_atom
|
||||||
|
playsound(S.loc, "swing_hit", 50, 1)
|
||||||
|
if(S.enemies.len)
|
||||||
|
if(prob(10))
|
||||||
|
S.enemies = list()
|
||||||
|
S.LoseTarget()
|
||||||
|
S.say("Ah, I give up, you've got a pretty good swing.")
|
||||||
|
call(/obj/item/weapon/winter_gift/proc/pick_a_gift)(S.loc)
|
||||||
|
else
|
||||||
|
S.say(pick("Didn't feel anything","You call that snowballing?"))
|
||||||
|
else
|
||||||
|
S.say(pick("A fight? With pleasure.","Don't forget that you're the one who started it all."))
|
||||||
|
S.Retaliate()
|
||||||
|
if(S.bodytemperature >= 232)
|
||||||
|
S.bodytemperature -= 5
|
||||||
|
else ..()
|
||||||
|
|
||||||
|
var/global/list/datum/stack_recipe/snow_recipes = list (
|
||||||
|
new/datum/stack_recipe("snowman", /mob/living/simple_animal/hostile/retaliate/snowman, 10, time = 50, one_per_turf = 0, on_floor = 1),
|
||||||
|
new/datum/stack_recipe("snow barricade", /obj/structure/barricade/snow, 20, time = 50, one_per_turf = 1, on_floor = 1),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//////BARRICADE//////
|
||||||
|
|
||||||
|
/obj/structure/barricade/snow
|
||||||
|
name = "snow barricade"
|
||||||
|
desc = "This space is blocked off by a snow barricade."
|
||||||
|
icon = 'icons/obj/structures.dmi'
|
||||||
|
icon_state = "snowbarricade"
|
||||||
|
anchored = 1.0
|
||||||
|
density = 1.0
|
||||||
|
var/health = 50.0
|
||||||
|
var/maxhealth = 50.0
|
||||||
|
|
||||||
|
/obj/structure/barricade/snow/attackby(obj/item/W as obj, mob/user as mob)
|
||||||
|
if (istype(W, /obj/item/stack/sheet/snow))
|
||||||
|
if (src.health < src.maxhealth)
|
||||||
|
visible_message("<span class='warning'>[user] begins to repair the [src]!</span>")
|
||||||
|
if(do_after(user,20))
|
||||||
|
src.health = src.maxhealth
|
||||||
|
W:use(1)
|
||||||
|
visible_message("<span class='warning'>[user] repairs the [src]</span>")
|
||||||
|
return
|
||||||
|
else
|
||||||
|
return
|
||||||
|
return
|
||||||
|
else
|
||||||
|
switch(W.damtype)
|
||||||
|
if("fire")
|
||||||
|
src.health -= W.force * 1
|
||||||
|
if("brute")
|
||||||
|
src.health -= W.force * 0.75
|
||||||
|
else
|
||||||
|
if (src.health <= 0)
|
||||||
|
visible_message("<span class='danger'>\the [src] is smashed apart!</span>")
|
||||||
|
new /obj/item/stack/sheet/snow(get_turf(src), 1)
|
||||||
|
new /obj/item/stack/sheet/snow(get_turf(src), 1)
|
||||||
|
new /obj/item/stack/sheet/snow(get_turf(src), 1)
|
||||||
|
del(src)
|
||||||
|
..()
|
||||||
|
|
||||||
|
/obj/structure/barricade/snow/ex_act(severity)
|
||||||
|
switch(severity)
|
||||||
|
if(1.0)
|
||||||
|
visible_message("<span class='danger'>\the [src] is blown apart!</span>")
|
||||||
|
qdel(src)
|
||||||
|
return
|
||||||
|
if(2.0)
|
||||||
|
src.health -= 25
|
||||||
|
if (src.health <= 0)
|
||||||
|
visible_message("<span class='danger'>\the [src] is blown apart!</span>")
|
||||||
|
new /obj/item/stack/sheet/snow(get_turf(src), 1)
|
||||||
|
new /obj/item/stack/sheet/snow(get_turf(src), 1)
|
||||||
|
new /obj/item/stack/sheet/snow(get_turf(src), 1)
|
||||||
|
qdel(src)
|
||||||
|
return
|
||||||
|
|
||||||
|
/obj/structure/barricade/snow/meteorhit()
|
||||||
|
visible_message("<span class='danger'>\the [src] is blown apart!</span>")
|
||||||
|
new /obj/item/stack/sheet/snow(get_turf(src), 1)
|
||||||
|
new /obj/item/stack/sheet/snow(get_turf(src), 1)
|
||||||
|
new /obj/item/stack/sheet/snow(get_turf(src), 1)
|
||||||
|
del(src)
|
||||||
|
return
|
||||||
|
|
||||||
|
/obj/structure/barricade/snow/blob_act()
|
||||||
|
src.health -= 25
|
||||||
|
if (src.health <= 0)
|
||||||
|
visible_message("<span class='danger'>The blob eats through \the [src]!</span>")
|
||||||
|
del(src)
|
||||||
|
return
|
||||||
|
|
||||||
|
/obj/structure/barricade/snow/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0)//So bullets will fly over and stuff.
|
||||||
|
if(air_group || (height==0))
|
||||||
|
return 1
|
||||||
|
if(istype(mover) && mover.checkpass(PASSTABLE))
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//////TREES//////
|
||||||
|
|
||||||
|
|
||||||
|
/obj/structure/snow_flora/sappling
|
||||||
|
name = "sappling"
|
||||||
|
desc = "Shh, it's growing..."
|
||||||
|
density = 0
|
||||||
|
anchored = 1
|
||||||
|
icon = 'icons/obj/flora/snowflora.dmi'
|
||||||
|
icon_state = "snowbush1"
|
||||||
|
|
||||||
|
var/growth = 0
|
||||||
|
|
||||||
|
/obj/structure/snow_flora/sappling/New()
|
||||||
|
..()
|
||||||
|
icon_state = pick(
|
||||||
|
"snowbush1",
|
||||||
|
"snowbush2",
|
||||||
|
"snowbush3",
|
||||||
|
"snowbush4",
|
||||||
|
"snowbush5",
|
||||||
|
"snowbush6",
|
||||||
|
)
|
||||||
|
|
||||||
|
growing()
|
||||||
|
|
||||||
|
/obj/structure/snow_flora/sappling/proc/growing()
|
||||||
|
if(growth > 20)
|
||||||
|
new/obj/structure/snow_flora/tree(get_turf(src))
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
if(locate(/obj/structure/snow) in get_turf(src))
|
||||||
|
growth++
|
||||||
|
spawn(40)
|
||||||
|
growing()
|
||||||
|
else
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/structure/snow_flora/sappling/attackby(obj/item/W,mob/user)
|
||||||
|
var/list/cutting = list(
|
||||||
|
/obj/item/weapon/minihoe,
|
||||||
|
/obj/item/weapon/scythe,
|
||||||
|
)
|
||||||
|
if(is_type_in_list(W,cutting))
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/structure/snow_flora/sappling/pine/growing()
|
||||||
|
if(growth > 30)
|
||||||
|
if(prob(20))
|
||||||
|
new/obj/structure/snow_flora/tree/pine/xmas(get_turf(src))
|
||||||
|
else
|
||||||
|
new/obj/structure/snow_flora/tree/pine(get_turf(src))
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
if(locate(/obj/structure/snow) in get_turf(src))
|
||||||
|
growth++
|
||||||
|
spawn(40)
|
||||||
|
growing()
|
||||||
|
else
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/structure/snow_flora/tree
|
||||||
|
name = "tree"
|
||||||
|
desc = "Where's my axe when I need it?"
|
||||||
|
density = 0
|
||||||
|
anchored = 1
|
||||||
|
layer = FLY_LAYER
|
||||||
|
icon = 'icons/obj/flora/deadtrees.dmi'
|
||||||
|
icon_state = "tree_1"
|
||||||
|
|
||||||
|
var/axe_hits = 0
|
||||||
|
|
||||||
|
/obj/structure/snow_flora/tree/New()
|
||||||
|
..()
|
||||||
|
icon_state = pick(
|
||||||
|
"tree_1",
|
||||||
|
"tree_2",
|
||||||
|
"tree_3",
|
||||||
|
"tree_4",
|
||||||
|
"tree_5",
|
||||||
|
"tree_6",
|
||||||
|
)
|
||||||
|
|
||||||
|
idle()
|
||||||
|
|
||||||
|
/obj/structure/snow_flora/tree/proc/idle()
|
||||||
|
if(!(locate(/obj/structure/snow) in get_turf(src)))
|
||||||
|
axe_hits++
|
||||||
|
if(axe_hits >= 3)
|
||||||
|
new/obj/item/weapon/grown/log(get_turf(src))
|
||||||
|
qdel(src)
|
||||||
|
return
|
||||||
|
spawn(50)
|
||||||
|
if(src)
|
||||||
|
idle()
|
||||||
|
|
||||||
|
/obj/structure/snow_flora/tree/attackby(obj/item/W,mob/user)
|
||||||
|
var/list/cutting = list(
|
||||||
|
/obj/item/weapon/hatchet,
|
||||||
|
/obj/item/weapon/twohanded/fireaxe,
|
||||||
|
)
|
||||||
|
if(is_type_in_list(W,cutting))
|
||||||
|
axe_hits++
|
||||||
|
user.visible_message("<span class='warning'>[user] hits \the [src] with \the [W].</span>")
|
||||||
|
if(axe_hits >= 3)
|
||||||
|
new/obj/item/weapon/grown/log(get_turf(src))
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/structure/snow_flora/tree/pine
|
||||||
|
name = "pine tree"
|
||||||
|
desc = "O Tannenbaum..."
|
||||||
|
icon = 'icons/obj/flora/pinetrees.dmi'
|
||||||
|
icon_state = "pine_1"
|
||||||
|
density = 1
|
||||||
|
|
||||||
|
pixel_x = -16
|
||||||
|
|
||||||
|
/obj/structure/snow_flora/tree/pine/New()
|
||||||
|
..()
|
||||||
|
icon_state = pick(
|
||||||
|
"pine_1",
|
||||||
|
"pine_2",
|
||||||
|
"pine_3",
|
||||||
|
)
|
||||||
|
|
||||||
|
if((snow_tiles >= 600) && prob(20))
|
||||||
|
new /mob/living/simple_animal/hostile/giant_spider/spiderling(get_turf(src))
|
||||||
|
|
||||||
|
if((snow_tiles >= 1000) && prob(20))
|
||||||
|
new /mob/living/simple_animal/hostile/bear(get_turf(src))
|
||||||
|
|
||||||
|
/obj/structure/snow_flora/tree/pine/attackby(obj/item/W,mob/user)
|
||||||
|
var/list/cutting = list(
|
||||||
|
/obj/item/weapon/hatchet,
|
||||||
|
/obj/item/weapon/twohanded/fireaxe,
|
||||||
|
)
|
||||||
|
if(is_type_in_list(W,cutting))
|
||||||
|
axe_hits++
|
||||||
|
user.visible_message("<span class='warning'>[user] hits \the [src] with \the [W].</span>")
|
||||||
|
if(axe_hits >= 5)
|
||||||
|
new/obj/item/weapon/grown/log(get_turf(src))
|
||||||
|
new/obj/item/weapon/grown/log(get_turf(src))
|
||||||
|
new/obj/item/weapon/grown/log(get_turf(src))
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/structure/snow_flora/tree/pine/idle()
|
||||||
|
if(!(locate(/obj/structure/snow) in get_turf(src)))
|
||||||
|
axe_hits++
|
||||||
|
if(axe_hits >= 5)
|
||||||
|
new/obj/item/weapon/grown/log(get_turf(src))
|
||||||
|
new/obj/item/weapon/grown/log(get_turf(src))
|
||||||
|
new/obj/item/weapon/grown/log(get_turf(src))
|
||||||
|
qdel(src)
|
||||||
|
return
|
||||||
|
spawn(50)
|
||||||
|
if(src)
|
||||||
|
idle()
|
||||||
|
|
||||||
|
/obj/structure/snow_flora/tree/pine/xmas
|
||||||
|
name = "christmas tree"
|
||||||
|
desc = "Heck yeah!"
|
||||||
|
icon = 'icons/obj/flora/pinetrees.dmi'
|
||||||
|
icon_state = "pine_c"
|
||||||
|
|
||||||
|
/obj/structure/snow_flora/tree/pine/xmas/New()
|
||||||
|
for(var/turf/simulated/floor/T in orange(1,src))
|
||||||
|
var/blocked = 0
|
||||||
|
for(var/atom/A in T)
|
||||||
|
if(A.density)
|
||||||
|
blocked = 1
|
||||||
|
if(blocked) continue
|
||||||
|
|
||||||
|
for(var/i=1,i<=rand(1,3),i++)
|
||||||
|
call(/obj/item/weapon/winter_gift/proc/pick_a_gift)(T,5)
|
||||||
@@ -706,6 +706,7 @@ var/global/floorIsLava = 0
|
|||||||
<A href='?src=\ref[src];secretsfun=spacevines'>Spawn Space-Vines</A><BR>
|
<A href='?src=\ref[src];secretsfun=spacevines'>Spawn Space-Vines</A><BR>
|
||||||
<A href='?src=\ref[src];secretsfun=comms_blackout'>Trigger a communication blackout</A><BR>
|
<A href='?src=\ref[src];secretsfun=comms_blackout'>Trigger a communication blackout</A><BR>
|
||||||
<A href='?src=\ref[src];secretsfun=pda_spam'>Trigger a wave of PDA spams</A><BR>
|
<A href='?src=\ref[src];secretsfun=pda_spam'>Trigger a wave of PDA spams</A><BR>
|
||||||
|
<A href='?src=\ref[src];secretsfun=freeze'>Spawn a cosmic snow storm</A><BR>
|
||||||
<BR>
|
<BR>
|
||||||
<B>Fun Secrets</B><BR>
|
<B>Fun Secrets</B><BR>
|
||||||
<BR>
|
<BR>
|
||||||
|
|||||||
@@ -2370,6 +2370,11 @@
|
|||||||
feedback_add_details("admin_secrets_fun_used","PDA")
|
feedback_add_details("admin_secrets_fun_used","PDA")
|
||||||
new /datum/event/pda_spam
|
new /datum/event/pda_spam
|
||||||
|
|
||||||
|
if("freeze")
|
||||||
|
feedback_inc("admin_secrets_fun_used",1)
|
||||||
|
feedback_add_details("admin_secrets_fun_used","CF")
|
||||||
|
new /datum/event/cosmic_freeze
|
||||||
|
|
||||||
if("spaceninja")
|
if("spaceninja")
|
||||||
feedback_inc("admin_secrets_fun_used",1)
|
feedback_inc("admin_secrets_fun_used",1)
|
||||||
feedback_add_details("admin_secrets_fun_used","SN")
|
feedback_add_details("admin_secrets_fun_used","SN")
|
||||||
|
|||||||
@@ -3,6 +3,12 @@
|
|||||||
var/list/species_restricted = null //Only these species can wear this kit.
|
var/list/species_restricted = null //Only these species can wear this kit.
|
||||||
var/wizard_garb = 0 // Wearing this empowers a wizard.
|
var/wizard_garb = 0 // Wearing this empowers a wizard.
|
||||||
|
|
||||||
|
//temperatures in Kelvin. These default values won't affect protections in any way.
|
||||||
|
var/cold_breath_protection = 300 //that cloth protects its wearer's breath from cold air down to that temperature
|
||||||
|
var/hot_breath_protection = 300 //that cloth protects its wearer's breath from hot air up to that temperature
|
||||||
|
|
||||||
|
var/cold_speed_protection = 300 //that cloth allows its wearer to keep walking at normal speed at lower temperatures
|
||||||
|
|
||||||
//BS12: Species-restricted clothing check.
|
//BS12: Species-restricted clothing check.
|
||||||
/obj/item/clothing/mob_can_equip(M as mob, slot)
|
/obj/item/clothing/mob_can_equip(M as mob, slot)
|
||||||
|
|
||||||
@@ -221,6 +227,8 @@ BLIND // can't see anything
|
|||||||
siemens_coefficient = 0.9
|
siemens_coefficient = 0.9
|
||||||
species_restricted = list("exclude","Diona","Muton")
|
species_restricted = list("exclude","Diona","Muton")
|
||||||
|
|
||||||
|
cold_breath_protection = 230
|
||||||
|
|
||||||
/obj/item/clothing/suit/space
|
/obj/item/clothing/suit/space
|
||||||
name = "Space suit"
|
name = "Space suit"
|
||||||
desc = "A suit that protects against low pressure environments. Has a big 13 on the back."
|
desc = "A suit that protects against low pressure environments. Has a big 13 on the back."
|
||||||
|
|||||||
@@ -235,6 +235,8 @@
|
|||||||
flags = FPRINT | TABLEPASS | BLOCKHAIR
|
flags = FPRINT | TABLEPASS | BLOCKHAIR
|
||||||
siemens_coefficient = 2.0
|
siemens_coefficient = 2.0
|
||||||
|
|
||||||
|
cold_breath_protection = 230
|
||||||
|
|
||||||
/obj/item/clothing/head/bearpelt
|
/obj/item/clothing/head/bearpelt
|
||||||
name = "bear pelt hat"
|
name = "bear pelt hat"
|
||||||
desc = "Fuzzy."
|
desc = "Fuzzy."
|
||||||
@@ -243,6 +245,8 @@
|
|||||||
flags = FPRINT | TABLEPASS | BLOCKHEADHAIR
|
flags = FPRINT | TABLEPASS | BLOCKHEADHAIR
|
||||||
siemens_coefficient = 2.0
|
siemens_coefficient = 2.0
|
||||||
|
|
||||||
|
cold_breath_protection = 230
|
||||||
|
|
||||||
/obj/item/clothing/head/xenos
|
/obj/item/clothing/head/xenos
|
||||||
name = "xenos helmet"
|
name = "xenos helmet"
|
||||||
icon_state = "xenos"
|
icon_state = "xenos"
|
||||||
@@ -296,4 +300,6 @@
|
|||||||
icon_state = "russofurhat"
|
icon_state = "russofurhat"
|
||||||
item_state = "russofurhat"
|
item_state = "russofurhat"
|
||||||
flags = FPRINT | TABLEPASS | BLOCKHEADHAIR
|
flags = FPRINT | TABLEPASS | BLOCKHEADHAIR
|
||||||
flags_inv = HIDEEARS
|
flags_inv = HIDEEARS
|
||||||
|
|
||||||
|
cold_breath_protection = 230
|
||||||
|
|||||||
@@ -104,6 +104,8 @@
|
|||||||
item_state = "ushankadown"
|
item_state = "ushankadown"
|
||||||
flags_inv = HIDEEARS
|
flags_inv = HIDEEARS
|
||||||
|
|
||||||
|
cold_breath_protection = 230
|
||||||
|
|
||||||
/obj/item/clothing/head/ushanka/attack_self(mob/user as mob)
|
/obj/item/clothing/head/ushanka/attack_self(mob/user as mob)
|
||||||
if(src.icon_state == "ushankadown")
|
if(src.icon_state == "ushankadown")
|
||||||
src.icon_state = "ushankaup"
|
src.icon_state = "ushankaup"
|
||||||
|
|||||||
@@ -8,6 +8,8 @@
|
|||||||
w_class = 2
|
w_class = 2
|
||||||
species_fit = list("Vox")
|
species_fit = list("Vox")
|
||||||
|
|
||||||
|
cold_breath_protection = 230
|
||||||
|
|
||||||
/obj/item/clothing/mask/luchador
|
/obj/item/clothing/mask/luchador
|
||||||
name = "Luchador Mask"
|
name = "Luchador Mask"
|
||||||
desc = "Worn by robust fighters, flying high to defeat their foes!"
|
desc = "Worn by robust fighters, flying high to defeat their foes!"
|
||||||
|
|||||||
@@ -38,7 +38,12 @@
|
|||||||
|
|
||||||
//scarves (fit in in mask slot)
|
//scarves (fit in in mask slot)
|
||||||
|
|
||||||
/obj/item/clothing/mask/bluescarf
|
/obj/item/clothing/mask/scarf
|
||||||
|
name = "scarf"
|
||||||
|
|
||||||
|
cold_breath_protection = 230
|
||||||
|
|
||||||
|
/obj/item/clothing/mask/scarf/blue
|
||||||
name = "blue neck scarf"
|
name = "blue neck scarf"
|
||||||
desc = "A blue neck scarf."
|
desc = "A blue neck scarf."
|
||||||
icon_state = "blueneckscarf"
|
icon_state = "blueneckscarf"
|
||||||
@@ -47,7 +52,7 @@
|
|||||||
w_class = 2
|
w_class = 2
|
||||||
gas_transfer_coefficient = 0.90
|
gas_transfer_coefficient = 0.90
|
||||||
|
|
||||||
/obj/item/clothing/mask/redscarf
|
/obj/item/clothing/mask/scarf/redwhite
|
||||||
name = "red scarf"
|
name = "red scarf"
|
||||||
desc = "A red and white checkered neck scarf."
|
desc = "A red and white checkered neck scarf."
|
||||||
icon_state = "redwhite_scarf"
|
icon_state = "redwhite_scarf"
|
||||||
@@ -56,7 +61,7 @@
|
|||||||
w_class = 2
|
w_class = 2
|
||||||
gas_transfer_coefficient = 0.90
|
gas_transfer_coefficient = 0.90
|
||||||
|
|
||||||
/obj/item/clothing/mask/greenscarf
|
/obj/item/clothing/mask/scarf/green
|
||||||
name = "green scarf"
|
name = "green scarf"
|
||||||
desc = "A green neck scarf."
|
desc = "A green neck scarf."
|
||||||
icon_state = "green_scarf"
|
icon_state = "green_scarf"
|
||||||
@@ -65,7 +70,7 @@
|
|||||||
w_class = 2
|
w_class = 2
|
||||||
gas_transfer_coefficient = 0.90
|
gas_transfer_coefficient = 0.90
|
||||||
|
|
||||||
/obj/item/clothing/mask/ninjascarf
|
/obj/item/clothing/mask/scarf/ninja
|
||||||
name = "ninja scarf"
|
name = "ninja scarf"
|
||||||
desc = "A stealthy, dark scarf."
|
desc = "A stealthy, dark scarf."
|
||||||
icon_state = "ninja_scarf"
|
icon_state = "ninja_scarf"
|
||||||
@@ -114,6 +119,8 @@
|
|||||||
w_class = 1
|
w_class = 1
|
||||||
can_flip = 1
|
can_flip = 1
|
||||||
|
|
||||||
|
cold_breath_protection = 230
|
||||||
|
|
||||||
obj/item/clothing/mask/bandana/red
|
obj/item/clothing/mask/bandana/red
|
||||||
name = "red bandana"
|
name = "red bandana"
|
||||||
icon_state = "bandred"
|
icon_state = "bandred"
|
||||||
@@ -91,6 +91,8 @@
|
|||||||
siemens_coefficient = 0.7
|
siemens_coefficient = 0.7
|
||||||
species_fit = list("Vox")
|
species_fit = list("Vox")
|
||||||
|
|
||||||
|
cold_speed_protection = 230
|
||||||
|
|
||||||
/obj/item/clothing/shoes/jackboots/batmanboots
|
/obj/item/clothing/shoes/jackboots/batmanboots
|
||||||
name = "batboots"
|
name = "batboots"
|
||||||
desc = "Criminal stomping boots for fighting crime and looking good."
|
desc = "Criminal stomping boots for fighting crime and looking good."
|
||||||
|
|||||||
@@ -49,6 +49,7 @@
|
|||||||
flags_inv = HIDEJUMPSUIT
|
flags_inv = HIDEJUMPSUIT
|
||||||
species_fit = list("Vox")
|
species_fit = list("Vox")
|
||||||
|
|
||||||
|
cold_speed_protection = 230
|
||||||
|
|
||||||
/obj/item/clothing/suit/cyborg_suit
|
/obj/item/clothing/suit/cyborg_suit
|
||||||
name = "cyborg suit"
|
name = "cyborg suit"
|
||||||
@@ -151,6 +152,8 @@
|
|||||||
flags_inv = HIDESHOES|HIDEJUMPSUIT
|
flags_inv = HIDESHOES|HIDEJUMPSUIT
|
||||||
siemens_coefficient = 2.0
|
siemens_coefficient = 2.0
|
||||||
|
|
||||||
|
cold_speed_protection = 230
|
||||||
|
|
||||||
|
|
||||||
/obj/item/clothing/suit/monkeysuit
|
/obj/item/clothing/suit/monkeysuit
|
||||||
name = "Monkey Suit"
|
name = "Monkey Suit"
|
||||||
@@ -380,15 +383,21 @@
|
|||||||
icon_state = "officersuit"
|
icon_state = "officersuit"
|
||||||
item_state = "officersuit"
|
item_state = "officersuit"
|
||||||
|
|
||||||
|
cold_speed_protection = 230
|
||||||
|
|
||||||
/obj/item/clothing/suit/soldiercoat
|
/obj/item/clothing/suit/soldiercoat
|
||||||
name = "Soldier's Coat"
|
name = "Soldier's Coat"
|
||||||
desc = "Ein Mantel gemacht, um die Verb<72>ndeten zu zerst<73>ren."
|
desc = "Ein Mantel gemacht, um die Verb<72>ndeten zu zerst<73>ren."
|
||||||
icon_state = "soldiersuit"
|
icon_state = "soldiersuit"
|
||||||
item_state = "soldiersuit"
|
item_state = "soldiersuit"
|
||||||
|
|
||||||
|
cold_speed_protection = 230
|
||||||
|
|
||||||
/obj/item/clothing/suit/russofurcoat
|
/obj/item/clothing/suit/russofurcoat
|
||||||
name = "russian fur coat"
|
name = "russian fur coat"
|
||||||
desc = "Let the land do the fighting for you."
|
desc = "Let the land do the fighting for you."
|
||||||
icon_state = "russofurcoat"
|
icon_state = "russofurcoat"
|
||||||
item_state = "russofurcoat"
|
item_state = "russofurcoat"
|
||||||
allowed = list(/obj/item/weapon/gun)
|
allowed = list(/obj/item/weapon/gun)
|
||||||
|
|
||||||
|
cold_speed_protection = 230
|
||||||
|
|||||||
@@ -1,183 +1,25 @@
|
|||||||
/obj/structure/snow
|
/var/global/snow_tiles = 0
|
||||||
name = "snow"
|
/var/global/bear_invasion = 0
|
||||||
layer = 2.5//above the plating and the vents, bellow most items and structures
|
|
||||||
icon = 'icons/turf/snow.dmi'
|
|
||||||
icon_state = "snow"
|
|
||||||
alpha = 230
|
|
||||||
anchored = 1
|
|
||||||
density = 0
|
|
||||||
mouse_opacity = 1
|
|
||||||
|
|
||||||
var/has_sappling = 0
|
/datum/event/cosmic_freeze
|
||||||
var/dug = 0
|
|
||||||
var/caught = 0
|
|
||||||
|
|
||||||
var/list/foliage = list(
|
/datum/event/cosmic_freeze/start()
|
||||||
"snowgrass1bb",
|
cosmic_freeze_event()
|
||||||
"snowgrass2bb",
|
|
||||||
"snowgrass3bb",
|
|
||||||
"snowgrass1gb",
|
|
||||||
"snowgrass2gb",
|
|
||||||
"snowgrass3gb",
|
|
||||||
"snowgrassall1",
|
|
||||||
"snowgrassall2",
|
|
||||||
"snowgrassall3",
|
|
||||||
)
|
|
||||||
|
|
||||||
var/list/sappling = list(
|
/datum/event/cosmic_freeze/announce()
|
||||||
"snowbush1",
|
command_alert("Thermal scans suggest that the close approach of a comet has somehow manifested a snow storm aboard the station. Allowing that storm to propagate through the station might have unforeseen consequences.", "Cosmic freeze")
|
||||||
"snowbush2",
|
|
||||||
"snowbush3",
|
|
||||||
"snowbush4",
|
|
||||||
"snowbush5",
|
|
||||||
"snowbush6",
|
|
||||||
)
|
|
||||||
|
|
||||||
var/list/trees = list(
|
|
||||||
"tree_1",
|
|
||||||
"tree_2",
|
|
||||||
"tree_3",
|
|
||||||
"tree_4",
|
|
||||||
"tree_5",
|
|
||||||
"tree_6",
|
|
||||||
)
|
|
||||||
|
|
||||||
var/list/pinetrees = list(
|
|
||||||
"pine_1",
|
|
||||||
"pine_2",
|
|
||||||
"pine_3",
|
|
||||||
)
|
|
||||||
|
|
||||||
/obj/structure/snow/New()
|
/*
|
||||||
..()
|
/obj/structure/snowreader
|
||||||
if(prob(17))
|
name = "snowreader"
|
||||||
overlays += image('icons/obj/flora/snowflora.dmi',pick(foliage))
|
|
||||||
|
|
||||||
/obj/structure/snow/attackby(obj/item/W,mob/user)
|
/obj/structure/snowreader/New()
|
||||||
if(istype(W,/obj/item/weapon/minihoe))
|
read_snow()
|
||||||
if(has_sappling)
|
|
||||||
has_sappling = 0
|
|
||||||
overlays = 0
|
|
||||||
|
|
||||||
if(istype(W,/obj/item/weapon/shovel))//using a shovel or spade harvests some snow and let's you click on the lower layers
|
/obj/structure/snowreader/proc/read_snow()
|
||||||
icon_state = "snow_dug"
|
world << "there are [snow_tiles] tiles covered in snow"
|
||||||
mouse_opacity = 0
|
sleep(30)
|
||||||
|
read_snow()
|
||||||
/obj/structure/snow/attack_hand(mob/user)
|
*/
|
||||||
if(dug || caught) return
|
|
||||||
playsound(get_turf(src), "rustle", 50, 1)
|
|
||||||
user << "<span class='notice'>You start digging the snow with your hands.</span>"
|
|
||||||
if(do_after(user,30))
|
|
||||||
caught = 1
|
|
||||||
user << "<span class='notice'>You pick.</span>"
|
|
||||||
user.put_in_hands(new /obj/item/stack/sheet/snow())
|
|
||||||
icon_state = "snow_grabbed"
|
|
||||||
sleep(400)
|
|
||||||
if(!dug)
|
|
||||||
icon_state = "snow"
|
|
||||||
caught = 0
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/item/stack/sheet/snow
|
|
||||||
name = "snow"
|
|
||||||
desc = "Technically water."
|
|
||||||
singular_name = "snow ball"
|
|
||||||
icon_state = "snow"
|
|
||||||
melt_temperature = MELTPOINT_SNOW
|
|
||||||
|
|
||||||
/obj/item/stack/sheet/snow/New(var/loc, var/amount=null)
|
|
||||||
recipes = snow_recipes
|
|
||||||
pixel_x = rand(-13,13)
|
|
||||||
pixel_y = rand(-13,13)
|
|
||||||
return ..()
|
|
||||||
|
|
||||||
/obj/item/stack/sheet/snow/melt()
|
|
||||||
var/turf/T = get_turf(src)
|
|
||||||
T.wet(800)
|
|
||||||
qdel(src)
|
|
||||||
|
|
||||||
var/global/list/datum/stack_recipe/snow_recipes = list (
|
|
||||||
new/datum/stack_recipe("snowman", /mob/living/simple_animal, 10, time = 50, one_per_turf = 0, on_floor = 1),
|
|
||||||
)
|
|
||||||
|
|
||||||
/obj/structure/barricade/snow
|
|
||||||
name = "snow barricade"
|
|
||||||
desc = "This space is blocked off by a snow barricade."
|
|
||||||
icon = 'icons/obj/structures.dmi'
|
|
||||||
icon_state = "snowbarricade"
|
|
||||||
anchored = 1.0
|
|
||||||
density = 1.0
|
|
||||||
var/health = 50.0
|
|
||||||
var/maxhealth = 50.0
|
|
||||||
|
|
||||||
/obj/structure/barricade/snow/attackby(obj/item/W as obj, mob/user as mob)
|
|
||||||
if (istype(W, /obj/item/stack/sheet/snow))
|
|
||||||
if (src.health < src.maxhealth)
|
|
||||||
visible_message("<span class='warning'>[user] begins to repair the [src]!</span>")
|
|
||||||
if(do_after(user,20))
|
|
||||||
src.health = src.maxhealth
|
|
||||||
W:use(1)
|
|
||||||
visible_message("<span class='warning'>[user] repairs the [src]</span>")
|
|
||||||
return
|
|
||||||
else
|
|
||||||
return
|
|
||||||
return
|
|
||||||
else
|
|
||||||
switch(W.damtype)
|
|
||||||
if("fire")
|
|
||||||
src.health -= W.force * 1
|
|
||||||
if("brute")
|
|
||||||
src.health -= W.force * 0.75
|
|
||||||
else
|
|
||||||
if (src.health <= 0)
|
|
||||||
visible_message("<span class='danger'>The barricade is smashed apart!</span>")
|
|
||||||
new /obj/item/stack/sheet/snow(get_turf(src, 1))
|
|
||||||
new /obj/item/stack/sheet/snow(get_turf(src, 1))
|
|
||||||
new /obj/item/stack/sheet/snow(get_turf(src, 1))
|
|
||||||
del(src)
|
|
||||||
..()
|
|
||||||
|
|
||||||
/obj/structure/barricade/snow/ex_act(severity)
|
|
||||||
switch(severity)
|
|
||||||
if(1.0)
|
|
||||||
visible_message("<span class='danger'>\the [src] is blown apart!</span>")
|
|
||||||
qdel(src)
|
|
||||||
return
|
|
||||||
if(2.0)
|
|
||||||
src.health -= 25
|
|
||||||
if (src.health <= 0)
|
|
||||||
visible_message("<span class='danger'>\the [src] is blown apart!</span>")
|
|
||||||
new /obj/item/stack/sheet/snow(get_turf(src, 1))
|
|
||||||
new /obj/item/stack/sheet/snow(get_turf(src, 1))
|
|
||||||
new /obj/item/stack/sheet/snow(get_turf(src, 1))
|
|
||||||
qdel(src)
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/structure/barricade/snow/meteorhit()
|
|
||||||
visible_message("<span class='danger'>\the [src] is blown apart!</span>")
|
|
||||||
new /obj/item/stack/sheet/snow(get_turf(src, 1))
|
|
||||||
new /obj/item/stack/sheet/snow(get_turf(src, 1))
|
|
||||||
new /obj/item/stack/sheet/snow(get_turf(src, 1))
|
|
||||||
del(src)
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/structure/barricade/snow/blob_act()
|
|
||||||
src.health -= 25
|
|
||||||
if (src.health <= 0)
|
|
||||||
visible_message("<span class='danger'>The blob eats through \the [src]!</span>")
|
|
||||||
del(src)
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/structure/barricade/snow/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0)//So bullets will fly over and stuff.
|
|
||||||
if(air_group || (height==0))
|
|
||||||
return 1
|
|
||||||
if(istype(mover) && mover.checkpass(PASSTABLE))
|
|
||||||
return 1
|
|
||||||
else
|
|
||||||
return 0
|
|
||||||
|
|
||||||
/obj/structure/tree
|
|
||||||
name = "tree"
|
|
||||||
layer = FLY_LAYER
|
|
||||||
icon = 'icons/obj/flora/deadtrees.dmi'
|
|
||||||
icon_state = "tree_1"
|
|
||||||
@@ -47,6 +47,15 @@ var/list/event_last_fired = list()
|
|||||||
possibleEvents[/datum/event/electrical_storm] = 10
|
possibleEvents[/datum/event/electrical_storm] = 10
|
||||||
possibleEvents[/datum/event/wallrot] = 30
|
possibleEvents[/datum/event/wallrot] = 30
|
||||||
|
|
||||||
|
var/current_month = text2num(time2text(world.timeofday, "MM"))
|
||||||
|
switch(current_month)
|
||||||
|
if(12,1,2)
|
||||||
|
if(snow_tiles <= 10)
|
||||||
|
possibleEvents[/datum/event/cosmic_freeze] = 30
|
||||||
|
if(3 to 11)
|
||||||
|
if(snow_tiles == 0)
|
||||||
|
possibleEvents[/datum/event/cosmic_freeze] = 15
|
||||||
|
|
||||||
if(!spacevines_spawned)
|
if(!spacevines_spawned)
|
||||||
possibleEvents[/datum/event/spacevine] = 15
|
possibleEvents[/datum/event/spacevine] = 15
|
||||||
if(minutes_passed >= 30 && active_with_role["Engineer"] > 1) // Give engineers time to not set up the engine
|
if(minutes_passed >= 30 && active_with_role["Engineer"] > 1) // Give engineers time to not set up the engine
|
||||||
|
|||||||
@@ -53,7 +53,7 @@
|
|||||||
return -1 // slimes become supercharged at high temperatures
|
return -1 // slimes become supercharged at high temperatures
|
||||||
if (bodytemperature < 183.222)
|
if (bodytemperature < 183.222)
|
||||||
tally += (283.222 - bodytemperature) / 10 * 1.75
|
tally += (283.222 - bodytemperature) / 10 * 1.75
|
||||||
else if (bodytemperature < 283.222)
|
else if ((bodytemperature < 283.222) && !check_speed_protections())
|
||||||
|
|
||||||
tally += (283.222 - bodytemperature) / 10 * 1.75
|
tally += (283.222 - bodytemperature) / 10 * 1.75
|
||||||
|
|
||||||
@@ -62,6 +62,15 @@
|
|||||||
|
|
||||||
return (tally+config.human_delay)
|
return (tally+config.human_delay)
|
||||||
|
|
||||||
|
/mob/living/carbon/human/proc/check_speed_protections()
|
||||||
|
var/list/human_slots = get_cloth_slots()
|
||||||
|
|
||||||
|
for(var/obj/item/clothing/C in human_slots)
|
||||||
|
if(C.cold_speed_protection < bodytemperature)
|
||||||
|
return 1
|
||||||
|
|
||||||
|
return 0
|
||||||
|
|
||||||
/mob/living/carbon/human/Process_Spacemove(var/check_drift = 0)
|
/mob/living/carbon/human/Process_Spacemove(var/check_drift = 0)
|
||||||
//Can we act
|
//Can we act
|
||||||
if(restrained()) return 0
|
if(restrained()) return 0
|
||||||
|
|||||||
@@ -37,6 +37,21 @@
|
|||||||
r_store,
|
r_store,
|
||||||
s_store)
|
s_store)
|
||||||
|
|
||||||
|
/mob/living/carbon/human/proc/get_cloth_slots()
|
||||||
|
return list(
|
||||||
|
back,
|
||||||
|
wear_mask,
|
||||||
|
belt,
|
||||||
|
wear_id,
|
||||||
|
ears,
|
||||||
|
glasses,
|
||||||
|
gloves,
|
||||||
|
head,
|
||||||
|
shoes,
|
||||||
|
wear_suit,
|
||||||
|
w_uniform,
|
||||||
|
)
|
||||||
|
|
||||||
/mob/living/carbon/human/proc/equip_in_one_of_slots(obj/item/W, list/slots, act_on_fail = 1)
|
/mob/living/carbon/human/proc/equip_in_one_of_slots(obj/item/W, list/slots, act_on_fail = 1)
|
||||||
for (var/slot in slots)
|
for (var/slot in slots)
|
||||||
if (equip_to_slot_if_possible(W, slots[slot], 0))
|
if (equip_to_slot_if_possible(W, slots[slot], 0))
|
||||||
|
|||||||
@@ -256,14 +256,14 @@ var/global/list/whitelisted_species = list("Human")
|
|||||||
if( (abs(310.15 - breath.temperature) > 50) && !(M_RESIST_HEAT in H.mutations)) // Hot air hurts :(
|
if( (abs(310.15 - breath.temperature) > 50) && !(M_RESIST_HEAT in H.mutations)) // Hot air hurts :(
|
||||||
if(H.status_flags & GODMODE) return 1 //godmode
|
if(H.status_flags & GODMODE) return 1 //godmode
|
||||||
if(breath.temperature < cold_level_1)
|
if(breath.temperature < cold_level_1)
|
||||||
if(prob(20))
|
if(prob(20) && !check_breath_protections(H,breath.temperature))
|
||||||
H << "\red You feel your face freezing and an icicle forming in your lungs!"
|
H << "<span class='warning'>You feel your face freezing and an icicle forming in your lungs!</span>"
|
||||||
else if(breath.temperature > heat_level_1)
|
else if(breath.temperature > heat_level_1)
|
||||||
if(prob(20))
|
if(prob(20))
|
||||||
if(H.dna.mutantrace == "slime")
|
if(H.dna.mutantrace == "slime")
|
||||||
H << "\red You feel supercharged by the extreme heat!"
|
H << "<span class='warning'>You feel supercharged by the extreme heat!</span>"
|
||||||
else
|
else
|
||||||
H << "\red You feel your face burning and a searing heat in your lungs!"
|
H << "<span class='warning'>You feel your face burning and a searing heat in your lungs!</span>"
|
||||||
|
|
||||||
if(H.dna.mutantrace == "slime")
|
if(H.dna.mutantrace == "slime")
|
||||||
if(breath.temperature < cold_level_1)
|
if(breath.temperature < cold_level_1)
|
||||||
@@ -271,32 +271,42 @@ var/global/list/whitelisted_species = list("Human")
|
|||||||
H.fire_alert = max(H.fire_alert, 1)
|
H.fire_alert = max(H.fire_alert, 1)
|
||||||
|
|
||||||
if(H.dna.mutantrace != "slime")
|
if(H.dna.mutantrace != "slime")
|
||||||
switch(breath.temperature)
|
if(!check_breath_protections(H,breath.temperature))
|
||||||
if(-INFINITY to cold_level_3)
|
switch(breath.temperature)
|
||||||
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold")
|
if(-INFINITY to cold_level_3)
|
||||||
H.fire_alert = max(H.fire_alert, 1)
|
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold")
|
||||||
|
H.fire_alert = max(H.fire_alert, 1)
|
||||||
|
|
||||||
if(cold_level_3 to cold_level_2)
|
if(cold_level_3 to cold_level_2)
|
||||||
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Cold")
|
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Cold")
|
||||||
H.fire_alert = max(H.fire_alert, 1)
|
H.fire_alert = max(H.fire_alert, 1)
|
||||||
|
|
||||||
if(cold_level_2 to cold_level_1)
|
if(cold_level_2 to cold_level_1)
|
||||||
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Cold")
|
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Cold")
|
||||||
H.fire_alert = max(H.fire_alert, 1)
|
H.fire_alert = max(H.fire_alert, 1)
|
||||||
|
|
||||||
if(heat_level_1 to heat_level_2)
|
if(heat_level_1 to heat_level_2)
|
||||||
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat")
|
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat")
|
||||||
H.fire_alert = max(H.fire_alert, 2)
|
H.fire_alert = max(H.fire_alert, 2)
|
||||||
|
|
||||||
if(heat_level_2 to heat_level_3)
|
if(heat_level_2 to heat_level_3)
|
||||||
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat")
|
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat")
|
||||||
H.fire_alert = max(H.fire_alert, 2)
|
H.fire_alert = max(H.fire_alert, 2)
|
||||||
|
|
||||||
if(heat_level_3 to INFINITY)
|
if(heat_level_3 to INFINITY)
|
||||||
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
|
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
|
||||||
H.fire_alert = max(H.fire_alert, 2)
|
H.fire_alert = max(H.fire_alert, 2)
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
/datum/species/proc/check_breath_protections(var/mob/living/carbon/human/H,var/temperature)
|
||||||
|
var/list/human_slots = H.get_cloth_slots()
|
||||||
|
|
||||||
|
for(var/obj/item/clothing/C in human_slots)
|
||||||
|
if((C.cold_breath_protection < temperature) || (C.hot_breath_protection > temperature))
|
||||||
|
return 1
|
||||||
|
|
||||||
|
return 0
|
||||||
|
|
||||||
// Used for species-specific names (Vox, etc)
|
// Used for species-specific names (Vox, etc)
|
||||||
/datum/species/proc/makeName(var/gender,var/mob/living/carbon/C=null)
|
/datum/species/proc/makeName(var/gender,var/mob/living/carbon/C=null)
|
||||||
if(gender==FEMALE) return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
|
if(gender==FEMALE) return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
/mob/living/simple_animal/snowman
|
|
||||||
name = "snowman"
|
|
||||||
desc = "Good day sir."
|
|
||||||
icon_state = "crab"
|
|
||||||
icon_living = "crab"
|
|
||||||
icon_dead = "crab_dead"
|
|
||||||
small = 1
|
|
||||||
speak_emote = list("clicks")
|
|
||||||
emote_hear = list("clicks")
|
|
||||||
emote_see = list("clacks")
|
|
||||||
speak_chance = 1
|
|
||||||
turns_per_move = 5
|
|
||||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
|
|
||||||
response_help = "pets"
|
|
||||||
response_disarm = "gently pushes aside"
|
|
||||||
response_harm = "stomps"
|
|
||||||
stop_automated_movement = 1
|
|
||||||
friendly = "pinches"
|
|
||||||
var/obj/item/inventory_head
|
|
||||||
var/obj/item/inventory_mask
|
|
||||||
|
|
||||||
/mob/living/simple_animal/snowman/Life()
|
|
||||||
..()
|
|
||||||
//CRAB movement
|
|
||||||
if(!ckey && !stat)
|
|
||||||
if(isturf(src.loc) && !resting && !buckled) //This is so it only moves if it's not inside a closet, gentics machine, etc.
|
|
||||||
turns_since_move++
|
|
||||||
if(turns_since_move >= turns_per_move)
|
|
||||||
Move(get_step(src,pick(4,8)))
|
|
||||||
turns_since_move = 0
|
|
||||||
regenerate_icons()
|
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
/mob/living/simple_animal/hostile/retaliate/snowman
|
||||||
|
name = "snowman"
|
||||||
|
desc = "Good day sir."
|
||||||
|
icon_state = "snowman"
|
||||||
|
icon_living = "snowman"
|
||||||
|
icon_dead = ""
|
||||||
|
speak = list("Good day sir.","Would you happen to have a carrot for my nose?","Cold day, isn't it?","What a pleasant weather.")
|
||||||
|
speak_emote = list("says")
|
||||||
|
emote_hear = list("says")
|
||||||
|
emote_see = list("hums")
|
||||||
|
speak_chance = 2.5
|
||||||
|
turns_per_move = 3
|
||||||
|
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
|
||||||
|
response_help = "hugs"
|
||||||
|
response_disarm = "gently pushes aside"
|
||||||
|
response_harm = "stomps"
|
||||||
|
friendly = "hugs"
|
||||||
|
faction = "snow"
|
||||||
|
health = 40
|
||||||
|
ranged = 1
|
||||||
|
retreat_distance = 5
|
||||||
|
minimum_distance = 3
|
||||||
|
projectilesound = 'sound/weapons/punchmiss.ogg'
|
||||||
|
projectiletype = /obj/item/projectile/snowball
|
||||||
|
environment_smash = 0
|
||||||
|
|
||||||
|
minbodytemp = 0
|
||||||
|
maxbodytemp = MELTPOINT_SNOW
|
||||||
|
heat_damage_per_tick = 5
|
||||||
|
bodytemperature = 270
|
||||||
|
|
||||||
|
var/obj/item/hat = null
|
||||||
|
var/obj/item/carrot = null
|
||||||
|
|
||||||
|
/mob/living/simple_animal/hostile/retaliate/snowman/Life()
|
||||||
|
..()
|
||||||
|
if(!ckey && !stat)
|
||||||
|
if(isturf(src.loc) && !resting && !buckled) //This is so it only moves if it's not inside a closet, gentics machine, etc.
|
||||||
|
turns_since_move++
|
||||||
|
if(turns_since_move >= turns_per_move)
|
||||||
|
Move(get_step(src,pick(4,8)))
|
||||||
|
turns_since_move = 0
|
||||||
|
|
||||||
|
if(enemies.len && prob(5))
|
||||||
|
enemies = list()
|
||||||
|
LoseTarget()
|
||||||
|
src.say("Whatever.")
|
||||||
|
|
||||||
|
if(stat)
|
||||||
|
visible_message("<span class='game say'><span class='name'>[src.name]</span> murmurs, [pick("Oh my snowballs...","I will...be back...")]</span>")
|
||||||
|
visible_message("\the [src] collapses in a pile of snow.")
|
||||||
|
var/turf/T = get_turf(src)
|
||||||
|
new /obj/item/stack/sheet/snow(T, 1)
|
||||||
|
new /obj/item/stack/sheet/snow(T, 1)
|
||||||
|
new /obj/item/stack/sheet/snow(T, 1)
|
||||||
|
if(hat)
|
||||||
|
hat.loc = T
|
||||||
|
if(carrot)
|
||||||
|
carrot.loc = T
|
||||||
|
del(src)
|
||||||
|
|
||||||
|
else if(fire_alert)
|
||||||
|
src.say(pick("Oh god the heat...","I'm meltiiinggg...","Someone turn off the heater!"))
|
||||||
|
|
||||||
|
regenerate_icons()
|
||||||
|
|
||||||
|
/mob/living/simple_animal/hostile/retaliate/snowman/Retaliate()
|
||||||
|
..()
|
||||||
|
if(!stat)
|
||||||
|
src.say(pick("You, come fight me!","I say!","Coward!"))
|
||||||
|
|
||||||
|
/mob/living/simple_animal/hostile/retaliate/snowman/attackby(var/obj/item/W, var/mob/user)
|
||||||
|
if(!carrot && istype(W, /obj/item/weapon/reagent_containers/food/snacks/grown/carrot))
|
||||||
|
visible_message("<span class='notice'>[user] puts \a [W] on \the [src]'s nose.</span>")
|
||||||
|
user.drop_item()
|
||||||
|
carrot = W
|
||||||
|
carrot.loc = src
|
||||||
|
overlays += "snowman_carrot"
|
||||||
|
speak -= "Would you happen to have a carrot for my nose?"
|
||||||
|
src.say("Ah, most excellent!")
|
||||||
|
if(prob(30))
|
||||||
|
call(/obj/item/weapon/winter_gift/proc/pick_a_gift)(src.loc)
|
||||||
|
|
||||||
|
else if(istype(W,/obj/item/clothing/head/))
|
||||||
|
if(hat)
|
||||||
|
hat.loc = get_turf(src)
|
||||||
|
overlays -= image('icons/mob/head.dmi', hat.icon_state)
|
||||||
|
hat = null
|
||||||
|
else
|
||||||
|
speak += "I feel so dandy!"
|
||||||
|
user.drop_item()
|
||||||
|
hat = W
|
||||||
|
hat.loc = src
|
||||||
|
|
||||||
|
overlays += image('icons/mob/head.dmi', hat.icon_state)
|
||||||
|
|
||||||
|
else ..()
|
||||||
|
|
||||||
|
/obj/item/projectile/snowball
|
||||||
|
name = "flying snowball"
|
||||||
|
desc = "Think fast!"
|
||||||
|
icon = 'icons/obj/items.dmi'
|
||||||
|
icon_state = "snow"
|
||||||
|
nodamage = 1
|
||||||
|
stun = 1
|
||||||
|
weaken = 1
|
||||||
|
stutter = 1
|
||||||
|
|
||||||
|
/obj/item/projectile/snowball/Bump(atom/A as mob|obj|turf|area)
|
||||||
|
.=..()
|
||||||
|
if(.)
|
||||||
|
playsound(A.loc, "swing_hit", 50, 1)
|
||||||
|
if(istype(A,/mob/living/carbon/))
|
||||||
|
var/mob/living/carbon/C = A
|
||||||
|
if(C.bodytemperature >= 265)
|
||||||
|
C.bodytemperature -= 5
|
||||||
@@ -3,6 +3,8 @@
|
|||||||
icon = 'icons/mob/animal.dmi'
|
icon = 'icons/mob/animal.dmi'
|
||||||
health = 20
|
health = 20
|
||||||
maxHealth = 20
|
maxHealth = 20
|
||||||
|
fire_dmi = 'icons/mob/OnFire.dmi'
|
||||||
|
fire_sprite = "Generic_mob_burning"
|
||||||
|
|
||||||
var/icon_living = ""
|
var/icon_living = ""
|
||||||
var/icon_dead = ""
|
var/icon_dead = ""
|
||||||
|
|||||||
@@ -58,7 +58,7 @@
|
|||||||
if(200 to 260)
|
if(200 to 260)
|
||||||
name = "cold beam" //temp at which mobs start taking COLD_DAMAGE_LEVEL_1
|
name = "cold beam" //temp at which mobs start taking COLD_DAMAGE_LEVEL_1
|
||||||
icon_state = "temp_2"
|
icon_state = "temp_2"
|
||||||
if(120 to 260)
|
if(120 to 200)
|
||||||
name = "ice beam" //temp at which mobs start taking COLD_DAMAGE_LEVEL_2
|
name = "ice beam" //temp at which mobs start taking COLD_DAMAGE_LEVEL_2
|
||||||
icon_state = "temp_1"
|
icon_state = "temp_1"
|
||||||
if(-INFINITY to 120)
|
if(-INFINITY to 120)
|
||||||
@@ -78,6 +78,9 @@
|
|||||||
if(temperature > 500)//emagged
|
if(temperature > 500)//emagged
|
||||||
M.adjust_fire_stacks(0.5)
|
M.adjust_fire_stacks(0.5)
|
||||||
M.on_fire = 1
|
M.on_fire = 1
|
||||||
|
if(M.fire_dmi && M.fire_sprite)
|
||||||
|
M.fire_overlay = image(M.fire_dmi,M.fire_sprite)
|
||||||
|
M.overlays += M.fire_overlay
|
||||||
M.update_icon = 1
|
M.update_icon = 1
|
||||||
playsound(M.loc, 'sound/effects/bamf.ogg', 50, 0)
|
playsound(M.loc, 'sound/effects/bamf.ogg', 50, 0)
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
@@ -419,6 +419,7 @@ var/MAX_EXPLOSION_RANGE = 14
|
|||||||
#define POWEROFF 4 // tbd
|
#define POWEROFF 4 // tbd
|
||||||
#define MAINT 8 // under maintaince
|
#define MAINT 8 // under maintaince
|
||||||
#define EMPED 16 // temporary broken by EMP pulse
|
#define EMPED 16 // temporary broken by EMP pulse
|
||||||
|
#define FROZEN 32 // frozen by cosmic snow
|
||||||
|
|
||||||
//bitflags for door switches.
|
//bitflags for door switches.
|
||||||
#define OPEN 1
|
#define OPEN 1
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 245 KiB After Width: | Height: | Size: 246 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 49 KiB |
Reference in New Issue
Block a user