Adds two new event species

This commit is contained in:
ZomgPonies
2015-05-14 22:30:38 -04:00
parent ec5acc5e57
commit 95b1c1d87c
28 changed files with 927 additions and 142 deletions
+179
View File
@@ -0,0 +1,179 @@
//separate dm since hydro is getting bloated already
/obj/effect/supermatter_crystal
name = "supermatter growth"
anchored = 1
opacity = 0
density = 0
icon = 'icons/obj/lighting.dmi'
icon_state = "supermatter_crystalf"
layer = 2.1
light_color = "#8A8A00"
var/endurance = 100
var/delay = 1200
var/floor = 0
var/spreadChance = 10
var/spreadIntoAdjacentChance = 10
var/lastTick = 0
var/spreaded = 1
var/deleted = 0
/obj/effect/supermatter_crystal/single
spreadChance = 0
/obj/effect/supermatter_crystal/New()
..()
light_color = "#8A8A00"
dir = CalcDir()
if(!floor)
switch(dir) //offset to make it be on the wall rather than on the floor
if(NORTH)
pixel_y = 32
if(SOUTH)
pixel_y = -32
if(EAST)
pixel_x = 32
if(WEST)
pixel_x = -32
icon_state = "supermatter_crystal"
else
if( prob( 10 )) // Only 10% of all floor crystals survive, so there's not a forest of 'em
icon_state = "supermatter_crystalf"
name = "supermatter crystal"
density = 1
else
deleted = 1
del( src )
processing_objects += src
set_light(3)
lastTick = world.timeofday
/obj/effect/supermatter_crystal/Del()
if( !deleted )
visible_message("\red <B>\The [src] shatters!</B>")
new /obj/item/weapon/shard/supermatter( src.loc )
processing_objects -= src
..()
/obj/effect/supermatter_crystal/process()
if(!spreaded)
return
if(((world.timeofday - lastTick) > delay) || ((world.timeofday - lastTick) < 0))
lastTick = world.timeofday
spreaded = 0
for(var/mob/living/l in range( src, 2 ))
var/rads = 5
l.apply_effect(rads, IRRADIATE)
for(var/i=1,i<=3,i++)
if(prob(spreadChance))
var/list/possibleLocs = list()
var/spreadsIntoAdjacent = 0
if(prob(spreadIntoAdjacentChance))
spreadsIntoAdjacent = 1
for(var/turf/simulated/floor/floor in view(3,src))
if(spreadsIntoAdjacent || !locate(/obj/effect/supermatter_crystal) in view(1,floor))
possibleLocs += floor
if(!possibleLocs.len)
break
var/turf/newLoc = pick(possibleLocs)
var/crystalCount = 0 //hacky
var/placeCount = 1
for(var/obj/effect/supermatter_crystal/shroom in newLoc)
crystalCount++
for(var/wallDir in cardinal)
var/turf/isWall = get_step(newLoc,wallDir)
if(isWall.density)
placeCount++
if(crystalCount >= placeCount)
continue
var/obj/effect/supermatter_crystal/child = new /obj/effect/supermatter_crystal(newLoc)
if( child )
child.delay = delay
child.endurance = endurance
spreaded++
/obj/effect/supermatter_crystal/proc/CalcDir(turf/location = loc)
for(var/wallDir in cardinal)
var/turf/newTurf = get_step(location,wallDir)
if(newTurf.density)
return wallDir
/*
var/direction = 16
for(var/wallDir in cardinal)
var/turf/newTurf = get_step(location,wallDir)
if(newTurf.density)
direction |= wallDir
for(var/obj/effect/supermatter_crystal/crystal in location)
if(crystal == src)
continue
if(crystal.floor) //special
direction &= ~16
else
direction &= ~crystal.dir
var/list/dirList = list()
for(var/i=1,i<=16,i <<= 1)
if(direction & i)
dirList += i
if(dirList.len)
var/newDir = pick(dirList)
if(newDir == 16)
floor = 1
newDir = 1
return newDir
*/
floor = 1
return 1
/obj/effect/supermatter_crystal/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
endurance -= W.force
CheckEndurance()
/obj/effect/supermatter_crystal/ex_act(severity)
switch(severity)
if(1.0)
del(src)
return
if(2.0)
if (prob(50))
del(src)
return
if(3.0)
if (prob(5))
del(src)
return
else
return
/obj/effect/supermatter_crystal/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > 300)
endurance -= 5
CheckEndurance()
/obj/effect/supermatter_crystal/proc/CheckEndurance()
if(endurance <= 0)
del(src)
+103
View File
@@ -0,0 +1,103 @@
/obj/item/weapon/shard/supermatter
name = "supermatter shard"
desc = "A shard of supermatter. Incredibly dangerous, though not large enough to go critical."
force = 10.0
throwforce = 20.0
icon_state = "supermatter"
sharp = 1
edge = 1
w_class = 2
flags = CONDUCT
light_color = "#8A8A00"
var/brightness = 2
/obj/item/weapon/shard/supermatter/New()
src.icon_state = pick("supermatter")
switch(src.icon_state)
if("supermattersmall")
src.pixel_x = rand(-12, 12)
src.pixel_y = rand(-12, 12)
if("supermattermedium")
src.pixel_x = rand(-8, 8)
src.pixel_y = rand(-8, 8)
if("supermatterlarge")
src.pixel_x = rand(-5, 5)
src.pixel_y = rand(-5, 5)
else
set_light(brightness)
/obj/item/weapon/shard/supermatter/attackby(obj/item/weapon/W as obj, mob/user as mob)
if( istype( W, /obj/item/weapon/tongs ))
var/obj/item/weapon/tongs/T = W
T.pick_up( src )
T.icon_state = "tongs_supermatter"
return
..()
/obj/item/weapon/shard/supermatter/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
return ..()
/obj/item/weapon/shard/supermatter/Crossed(AM as mob|obj)
if(ismob(AM))
var/mob/M = AM
M << "\red <B>You step on \the [src]!</B>"
playsound(src.loc, 'sound/effects/glass_step_sm.ogg', 70, 1) // not sure how to handle metal shards with sounds
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.species.flags & IS_SYNTHETIC) //Thick skin.
return
if( !H.shoes && ( !H.wear_suit || !(H.wear_suit.body_parts_covered & FEET) ) )
var/obj/item/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot"))
if(affecting.status & ORGAN_ROBOT)
return
if(affecting.take_damage(5, 20))
H.UpdateDamageIcon()
H.updatehealth()
if(!(H.species && (H.species.flags & NO_PAIN)))
H.Weaken(3)
..()
/obj/item/weapon/shard/supermatter/attack_hand(var/mob/user)
if(!istype(user,/mob/living/carbon/human/nucleation))
user << pick( "\red You think twice before touching that without protection.",
"\red You don't want to touch that without some protection.",
"\red You probably should get something else to pick that up.",
"\red You aren't sure that's a good idea.",
"\red You aren't in the mood to get vaporized today.",
"\red You really don't feel like frying your hand off.",
"\red You assume that's a bad idea." )
return
..()
/obj/item/weapon/tongs
name = "tongs"
desc = "Tungsten-alloy tongs used for handling dangerous materials."
force = 7.0
throwforce = 12.0
icon = 'icons/obj/weapons.dmi'
icon_state = "tongs"
edge = 1
w_class = 2
flags = CONDUCT
var/obj/item/held = null // The item currently being held
/obj/item/weapon/tongs/proc/pick_up( var/obj/item/I )
held = I
I.loc = src
playsound(loc, 'sound/effects/tong_pickup.ogg', 50, 1, -1)
/obj/item/weapon/tongs/attack_self(var/mob/user as mob)
if( held )
var/turf/T = get_turf(user.loc)
held.loc = T
held = null
icon_state = initial(icon_state)
..()
+27 -8
View File
@@ -117,14 +117,33 @@
icon_state = "cutters-y"
item_state = "cutters_yellow"
/obj/item/weapon/wirecutters/attack(mob/living/carbon/C as mob, mob/user as mob)
if((C.handcuffed) && (istype(C.handcuffed, /obj/item/weapon/restraints/handcuffs/cable)))
usr.visible_message("\The [usr] cuts \the [C]'s restraints with \the [src]!",\
"You cut \the [C]'s restraints with \the [src]!",\
"You hear cable being cut.")
C.handcuffed = null
C.update_inv_handcuffed()
return
/obj/item/weapon/wirecutters/attack(mob/living/carbon/human/C as mob, mob/user as mob)
if(C.handcuffed)
if(C.species.name == "Wryn" && (locate(C.internal_organs_by_name["antennae"]) in C.internal_organs))
var/turf/p_loc = user.loc
var/turf/p_loc_m = C.loc
user.visible_message("\blue [user] begins to cut off [C]'s antennae.")
C << "\red <B>[user] begins to cut off your antennae!<B>"
do_after(C, 150)
if(p_loc == user.loc && p_loc_m == C.loc)
del(C.internal_organs_by_name["antennae"])
C.remove_language("Wryn Hivemind")
new /obj/item/organ/wryn/hivenode(user.loc)
user << "\blue You hear a loud crunch as you mercilessly off cut [C]'s antennae."
C << "\red <B>You hear a loud crunch as the wirecutters rip through your antennae.</B>"
C << "\red <B>Its so quiet...</B>"
C.h_style = "Bald"
C.update_hair()
else
if(istype(C.handcuffed, /obj/item/weapon/restraints/handcuffs/cable))
usr.visible_message("\The [usr] cuts \the [C]'s restraints with \the [src]!",\
"You cut \the [C]'s restraints with \the [src]!",\
"You hear cable being cut.")
C.handcuffed = null
C.update_inv_handcuffed()
return
else
..()
+6
View File
@@ -114,6 +114,12 @@
shroom.icon_state = "glowshroomf"
shroom.pixel_x = 0
shroom.pixel_y = 0
for(var/obj/effect/supermatter_crystal/crystal in get_step(src,direction))
if(!crystal.floor) //crystals drop to the floor
crystal.floor = 1
crystal.icon_state = "supermatter_crystalf"
crystal.pixel_x = 0
crystal.pixel_y = 0
..()
/turf/simulated/wall/relativewall()
+2 -2
View File
@@ -970,7 +970,7 @@ datum/preferences
if("age")
age = rand(AGE_MIN, AGE_MAX)
if("hair")
if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine")
if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine" || species == "Wryn")
r_hair = rand(0,255)
g_hair = rand(0,255)
b_hair = rand(0,255)
@@ -996,7 +996,7 @@ datum/preferences
if(species == "Human")
s_tone = random_skin_tone()
if("s_color")
if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People")
if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People" || species == "Wryn")
r_skin = rand(0,255)
g_skin = rand(0,255)
b_skin = rand(0,255)
+5 -5
View File
@@ -45,7 +45,7 @@
//Set species_restricted list
switch(target_species)
if("Human", "Skrell") //humanoid bodytypes
species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox")
species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox","Wryn")
else
species_restricted = list(target_species)
@@ -161,7 +161,7 @@ BLIND // can't see anything
var/transfer_prints = FALSE
var/pickpocket = 0 //Master pickpocket?
var/clipped = 0
species_restricted = list("exclude","Unathi","Tajaran")
species_restricted = list("exclude","Unathi","Tajaran","Wryn")
/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/wirecutters))
@@ -295,7 +295,7 @@ BLIND // can't see anything
permeability_coefficient = 0.50
slowdown = SHOES_SLOWDOWN
species_restricted = list("exclude","Unathi","Tajaran")
species_restricted = list("exclude","Unathi","Tajaran","Wryn")
/obj/item/proc/negates_gravity()
return 0
@@ -328,7 +328,7 @@ BLIND // can't see anything
heat_protection = HEAD
max_heat_protection_temperature = SPACE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
siemens_coefficient = 0.9
species_restricted = list("exclude","Diona","Vox")
species_restricted = list("exclude","Diona","Vox","Wryn")
loose = 0 // What kind of idiot designs a pressurized suit where the helmet can fall off?
flash_protect = 2
@@ -351,7 +351,7 @@ BLIND // can't see anything
heat_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
siemens_coefficient = 0.9
species_restricted = list("exclude","Diona","Vox")
species_restricted = list("exclude","Diona","Vox","Wryn")
//Under clothing
/obj/item/clothing/under
+2 -2
View File
@@ -13,7 +13,7 @@
action_button_name = "Toggle Helmet Light"
//Species-specific stuff.
species_restricted = list("exclude","Unathi","Tajaran","Skrell","Diona","Vox")
species_restricted = list("exclude","Unathi","Tajaran","Skrell","Diona","Vox","Wryn")
sprite_sheets = list(
"Unathi" = 'icons/mob/species/unathi/helmet.dmi',
"Tajaran" = 'icons/mob/species/tajaran/helmet.dmi',
@@ -51,7 +51,7 @@
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/t_scanner, /obj/item/weapon/rcd)
species_restricted = list("exclude","Unathi","Tajaran","Skrell","Diona","Vox")
species_restricted = list("exclude","Unathi","Tajaran","Skrell","Diona","Vox","Wryn")
sprite_sheets = list(
"Unathi" = 'icons/mob/species/unathi/suit.dmi',
"Tajaran" = 'icons/mob/species/tajaran/suit.dmi',
+20
View File
@@ -326,6 +326,26 @@
key = "0"
syllables = list ("honk","squeak","bonk","toot","narf","zub","wee","wub","norf")
/datum/language/wryn
name = "Wryn Hivemind"
desc = "Wryn have the strange ability to commune over a psychic hivemind."
speech_verb = "chitters"
ask_verb = "chitters"
exclaim_verb = "chitters"
colour = "alien"
key = "y"
flags = RESTRICTED | HIVEMIND
/datum/language/wryn/check_special_condition(var/mob/other)
var/mob/living/carbon/M = other
if(!istype(M))
return 1
if(locate(/obj/item/organ/wryn/hivenode) in M.internal_organs)
return 1
return 0
/datum/language/xenocommon
name = "Xenomorph"
colour = "alien"
@@ -22,6 +22,9 @@
var/obj/mecha = null//This does not appear to be used outside of reference in mecha.dm.
attackby(var/obj/item/O as obj, var/mob/user as mob, params)
if(istype(O, /obj/item/organ/brain/crystal ))
user << "\red This brain is too malformed to be able to use with the [src]."
return
if(istype(O,/obj/item/organ/brain) && !brainmob) //Time to stick a brain in it --NEO
if(!O:brainmob)
user << "\red You aren't sure where this brain came from, but you're pretty sure it's a useless brain."
@@ -110,6 +110,14 @@
h_style = "Bald"
..(new_loc, "Golem")
/mob/living/carbon/human/wryn/New(var/new_loc)
h_style = "Antennae"
..(new_loc, "Wryn")
/mob/living/carbon/human/nucleation/New(var/new_loc)
h_style = "Nucleation Crystals"
..(new_loc, "Nucleation")
/mob/living/carbon/human/Bump(atom/movable/AM as mob|obj, yes)
if ((!( yes ) || now_pushing))
return
@@ -117,6 +117,30 @@
return
//end vampire codes
if(src.species.name == "Wryn")
if(src.handcuffed)
if(!(locate(src.internal_organs_by_name["antennae"]) in src.internal_organs)) return
var/turf/p_loc = M.loc
var/turf/p_loc_m = src.loc
M.visible_message("\blue [M] begins to violently pull off [src]'s antennae.")
src << "\red <B>[M] grips your antennae and starts violently pulling!<B>"
do_after(src, 250)
if(p_loc == M.loc && p_loc_m == src.loc)
del(src.internal_organs_by_name["antennae"])
src.remove_language("Wryn Hivemind")
new /obj/item/organ/wryn/hivenode(M.loc)
M << "\blue You hear a loud crunch as you mercilessly pull off [src]'s antennae."
src << "\red <B>You hear a loud crunch as your antennae is ripped off your head by [M].</B>"
src << "\red <B>Its so quiet...</B>"
src.h_style = "Bald"
src.update_hair()
M.attack_log += text("\[[time_stamp()]\] <font color='red'>removed antennae [src.name] ([src.ckey])</font>")
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has had their antennae removed by [M.name] ([M.ckey])</font>")
msg_admin_attack("[key_name(M)] removed [key_name(src)]'s antennae")
return 0
M.do_attack_animation(src)
add_logs(src, M, "[pick(attack.attack_verb)]ed")
@@ -6,7 +6,29 @@
tally -= 2
if(species.slowdown)
tally = species.slowdown
if(src.species.name == "Wryn") //handles Wryn specific movement
if(!istype(get_turf(src), /turf/space)) //Space is 20c whut..
var/loc_temp = T0C
var/datum/gas_mixture/environment = loc.return_air()
if(istype(src.loc, /obj/mecha))
var/obj/mecha/M = src.loc
loc_temp = M.return_temperature()
else
loc_temp = environment.temperature
switch(loc_temp) //messy switch statement to assign the proper speed
if(0 to 213.15) tally = -6 //you deserve this, god speed to you
if(213.15 to 250.15) tally = -5 //must get colder..
if(260.15 to 273.15) tally = -4
if(273.15 to 283.15) tally = -3 //pretty fast, though will likely never happen
if(283.15 to 300.15) tally = 2 //slower than humans at normal room temperatures
if(300.15 to 310.15) tally = 5
if(317.15 to 400) tally = 8
else tally = 12 //Stop running into fire you stupid bug
else
tally = -7
else
tally = species.slowdown
if (istype(loc, /turf/space)) return -1 // It's hard to be slowed down in space by... anything
+10 -1
View File
@@ -264,6 +264,16 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
gene.OnMobLife(src)
if (radiation)
if((locate(src.internal_organs_by_name["resonant crystal"]) in src.internal_organs))
var/rads = radiation/25
radiation -= rads
radiation -= 0.1
reagents.add_reagent("radium", rads/10)
if( prob(10) )
src << "\blue You feel relaxed."
return
if (radiation > 100)
radiation = 100
if(!(species.flags & RAD_ABSORB))
@@ -276,7 +286,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
radiation = 0
else
if(species.flags & RAD_ABSORB)
var/rads = radiation/25
radiation -= rads
@@ -0,0 +1,87 @@
/datum/species/wryn
name = "Wryn"
icobase = 'icons/mob/human_races/r_wryn.dmi'
deform = 'icons/mob/human_races/r_wryn.dmi'
language = "Wryn Hivemind"
tail = "wryntail"
unarmed_type = /datum/unarmed_attack/punch/weak
primitive = /mob/living/carbon/monkey/wryn
darksight = 3
slowdown = 1
warning_low_pressure = -300
hazard_low_pressure = 1
blurb = "The wryn (r-in, singular r-in) are a humanoid race that possess many bee-like features. Originating from Alveare they \
have adapted extremely well to cold environments though have lost most of their muscles over generations.\
In order to communicate and work with multi-species crew Wryn were forced to take on names. Wryn have tended towards using only \
first names, these names are generally simplistic and easy to pronounce. Wryn have rarely had to communicate using their mouths, \
so in order to integrate with the multi-species crew they have been taught broken sol?."
cold_level_1 = 200 //Default 260 - Lower is better
cold_level_2 = 150 //Default 200
cold_level_3 = 115 //Default 120
heat_level_1 = 300 //Default 360 - Higher is better
heat_level_2 = 310 //Default 400
heat_level_3 = 317 //Default 1000
body_temperature = 286
has_organ = list(
"heart" = /obj/item/organ/heart,
"brain" = /obj/item/organ/brain,
"eyes" = /obj/item/organ/eyes,
"appendix" = /obj/item/organ/appendix,
"antennae" = /obj/item/organ/wryn/hivenode
)
flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | NO_BREATHE | HAS_SKIN_COLOR | NO_SCAN | NO_SCAN | HIVEMIND
base_color = "#704300"
flesh_color = "#704300"
blood_color = "#FFFF99"
/datum/species/wryn/handle_death(var/mob/living/carbon/human/H)
for(var/mob/living/carbon/C in world)
if(locate(/obj/item/organ/wryn/hivenode) in C.internal_organs)
C << "\red <B>Your antennae tingle as you are overcome with pain...</B>"
C << "\red It feels like part of you has died."
/datum/species/nucleation
name = "Nucleation"
icobase = 'icons/mob/human_races/r_nucleation.dmi'
unarmed_type = /datum/unarmed_attack/punch
blurb = "A sub-race of unforunates who have been exposed to too much supermatter radiation. As a result, \
supermatter crystal clusters have begun to grow across their bodies. Research to find a cure for this ailment \
has been slow, and so this is a common fate for veteran engineers. The supermatter crystals produce oxygen, \
negating the need for the individual to breath. Their massive change in biology, however, renders most medicines \
obselete. Ionizing radiation seems to cause resonance in some of their crystals, which seems to encourage regeneration \
and produces a calming effect on the individual. Nucleations are highly stigmatized, and are treated much in the same \
way as lepers were back on Earth."
language = "Sol Common"
burn_mod = 4 // holy shite, poor guys wont survive half a second cooking smores
brute_mod = 2 // damn, double wham, double dam
flags = IS_WHITELISTED | NO_BREATHE | NO_BLOOD | NO_PAIN | HAS_LIPS | NO_SCAN
has_organ = list(
"heart" = /obj/item/organ/heart,
"crystalized brain" = /obj/item/organ/brain/crystal,
"eyes" = /obj/item/organ/eyes/luminescent_crystal,
"strange crystal" = /obj/item/organ/nucleation/strange_crystal,
"resonant crystal" = /obj/item/organ/nucleation/resonant_crystal
)
/datum/species/nucleation/handle_post_spawn(var/mob/living/carbon/human/H)
H.light_color = "#1C1C00"
H.set_light(2)
return ..()
/datum/species/nucleation/handle_death(var/mob/living/carbon/human/H)
var/turf/T = get_turf(H)
H.visible_message("\red[H]'s body explodes, leaving behind a pile of microscopic crystals!")
supermatter_delamination(T, 2, 0, 0) // Create a small supermatter burst upon death
new /obj/item/weapon/shard/supermatter( T )
del(H)
@@ -38,6 +38,13 @@
icon_state = "stokkey1"
uni_append = list(0x044,0xC5D) // 044C5D
/mob/living/carbon/monkey/wryn
name = "lajavi"
voice_name = "lajavi"
speak_emote = list("hisses")
icon_state = "wrynkey1"
uni_append = list(0x022,0xF5D) // 022F5D
/mob/living/carbon/monkey/New()
var/datum/reagents/R = new/datum/reagents(330)
reagents = R
@@ -745,6 +745,10 @@
/datum/unarmed_attack/punch
attack_verb = list("punch")
/datum/unarmed_attack/punch/weak
attack_verb = list("flail")
damage = 1
/datum/unarmed_attack/diona
attack_verb = list("lash", "bludgeon")
@@ -689,6 +689,51 @@
icon_state = "vox_keetquills"
species_allowed = list("Vox")
// Apollo-specific
//Wryn antennae
wry_antennae_default
name = "Antennae"
icon_state = "wryn_antennae"
species_allowed = list("Wryn")
//Nucleation "hairstyles"
nuc_crystals
name = "Nucleation Crystals"
icon_state = "nuc_crystal"
species_allowed = list("Nucleation")
nuc_betaburns
name = "Nucleation Beta Burns"
icon_state = "nuc_betaburns"
species_allowed = list("Nucleation")
nuc_fallout
name = "Nucleation Fallout"
icon_state = "nuc_fallout"
species_allowed = list("Nucleation")
nuc_frission
name = "Nucleation Frission"
icon_state = "nuc_frission"
species_allowed = list("Nucleation")
nuc_radical
name = "Nucleation Free Radical"
icon_state = "nuc_radical"
species_allowed = list("Nucleation")
nuc_gammaray
name = "Nucleation Gamma Ray"
icon_state = "nuc_gammaray"
species_allowed = list("Nucleation")
nuc_neutron
name = "Nucleation Neutron Bomb"
icon_state = "nuc_neutron"
species_allowed = list("Nucleation")
/datum/sprite_accessory/facial_hair
+48
View File
@@ -336,3 +336,51 @@
name = "vox cortical stack"
/obj/item/organ/stack/vox/stack
//WRYN ORGAN
/obj/item/organ/wryn/hivenode
name = "antennae"
parent_organ = "head"
/obj/item/organ/wryn/hivenode
name = "antennae"
organ_tag = "antennae"
icon = 'icons/mob/human_races/r_wryn.dmi'
icon_state = "antennae"
//NUCLEATION ORGAN
/obj/item/organ/nucleation
name = "nucleation organ"
icon = 'icons/obj/surgery.dmi'
desc = "A crystalized human organ. /red It has a strangely iridescent glow."
/obj/item/organ/nucleation/resonant_crystal
name = "resonant crystal"
icon_state = "resonant-crystal"
organ_tag = "resonant crystal"
parent_organ = "head"
/obj/item/organ/nucleation/strange_crystal
name = "strange crystal"
icon_state = "stramge-crystal"
organ_tag = "strange crystal"
parent_organ = "chest"
/obj/item/organ/eyes/luminescent_crystal
name = "luminescent eyes"
icon_state = "crystal-eyes"
organ_tag = "luminescent eyes"
light_color = "#1C1C00"
parent_organ = "head"
New()
set_light(2)
/obj/item/organ/brain/crystal
name = "crystalized brain"
icon_state = "crystal-brain"
organ_tag = "crystalized brain"
+246 -123
View File
@@ -1,23 +1,35 @@
#define NITROGEN_RETARDATION_FACTOR 4 //Higher == N2 slows reaction more
#define THERMAL_RELEASE_MODIFIER 750 //Higher == more heat released during reaction
#define PLASMA_RELEASE_MODIFIER 1500 //Higher == less plasma released by reaction
#define OXYGEN_RELEASE_MODIFIER 1500 //Higher == less oxygen released at high temperature/power
#define REACTION_POWER_MODIFIER 1.1 //Higher == more overall power
#define NITROGEN_RETARDATION_FACTOR 0.15 //Higher == N2 slows reaction more
#define THERMAL_RELEASE_MODIFIER 750 //Higher == more heat released during reaction
#define PLASMA_RELEASE_MODIFIER 1500 //Higher == less plasma released by reaction
#define OXYGEN_RELEASE_MODIFIER 1500 //Higher == less oxygen released at high temperature/power
#define REACTION_POWER_MODIFIER 1.1 //Higher == more overall power
/*
How to tweak the SM
POWER_FACTOR directly controls how much power the SM puts out at a given level of excitation (power var). Making this lower means you have to work the SM harder to get the same amount of power.
CRITICAL_TEMPERATURE The temperature at which the SM starts taking damage.
CHARGING_FACTOR Controls how much emitter shots excite the SM.
DAMAGE_RATE_LIMIT Controls the maximum rate at which the SM will take damage due to high temperatures.
*/
//Controls how much power is produced by each collector in range - this is the main parameter for tweaking SM balance, as it basically controls how the power variable relates to the rest of the game.
#define POWER_FACTOR 0.35 //Obtained from testing. Aiming to make the ideal running output (600 kW) run the SM to ~85% of the safety level.
#define CHARGING_FACTOR 0.55
#define DAMAGE_RATE_LIMIT 5 //damage rate cap at power = 900, scales linearly with power
#define POWER_FACTOR 1.0
#define DECAY_FACTOR 700 //Affects how fast the supermatter power decays
#define CRITICAL_TEMPERATURE 800 //K
#define CHARGING_FACTOR 0.05
#define DAMAGE_RATE_LIMIT 3 //damage rate cap at power = 300, scales linearly with power
//These would be what you would get at point blank, decreases with distance
#define DETONATION_RADS 200
#define DETONATION_HALLUCINATION 600
#define TRANSFORM_DISTANCE_MOD 2 // Size/this is maximum distance from SM during burst for transformation to Nucleation
#define WARNING_DELAY 30 //seconds between warnings.
#define WARNING_DELAY 30 //seconds between warnings.
/obj/machinery/power/supermatter
name = "Supermatter"
@@ -35,6 +47,7 @@
var/damage = 0
var/damage_archived = 0
var/safe_alert = "Crystaline hyperstructure returning to safe operating levels."
var/safe_warned = 0
var/warning_point = 100
var/warning_alert = "Danger! Crystal hyperstructure instability!"
var/emergency_point = 700
@@ -47,15 +60,20 @@
var/grav_pulling = 0
var/pull_radius = 14
// Time in ticks between delamination ('exploding') and exploding (as in the actual boom)
var/pull_time = 100
var/explosion_power = 8
var/emergency_issued = 0
var/explosion_power = 8
// Time in 1/10th of seconds since the last sent warning
var/lastwarning = 0
// This stops spawning redundand explosions. Also incidentally makes supermatter unexplodable if set to 1.
var/exploded = 0
var/lastwarning = 0 // Time in 1/10th of seconds since the last sent warning
var/power = 0
var/oxygen = 0 // Moving this up here for easier debugging.
var/oxygen = 0
//Temporary values so that we can optimize this
//How much the bullets damage should be multiplied by when it is added to the internal variables
@@ -67,21 +85,7 @@
var/obj/item/device/radio/radio
shard //Small subtype, less efficient and more sensitive, but less boom.
name = "Supermatter Shard"
desc = "A strangely translucent and iridescent crystal that looks like it used to be part of a larger structure. \red You get headaches just from looking at it."
icon_state = "darkmatter_shard"
base_icon_state = "darkmatter_shard"
warning_point = 50
emergency_point = 500
explosion_point = 900
gasefficency = 0.125
pull_radius = 5
explosion_power = 3 //3,6,9,12? Or is that too small?
var/debug = 0
/obj/machinery/power/supermatter/New()
. = ..()
@@ -93,17 +97,46 @@
. = ..()
/obj/machinery/power/supermatter/proc/explode()
message_admins("Supermatter exploded at ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
log_game("Supermatter exploded at ([x],[y],[z])")
anchored = 1
grav_pulling = 1
spawn(100)
explosion(get_turf(src), explosion_power, explosion_power * 2, explosion_power * 3, explosion_power * 4, 1)
exploded = 1
spawn(pull_time)
var/turf/epicenter = get_turf(src)
explosion(epicenter, explosion_power, explosion_power*2, explosion_power*3, explosion_power*4, 1)
supermatter_delamination( epicenter, explosion_power*4, 1 )
del src
return
//Changes color and luminosity of the light to these values if they were not already set
//Changes color and light_range of the light to these values if they were not already set
/obj/machinery/power/supermatter/proc/shift_light(var/lum, var/clr)
if(lum != light_range || clr != light_color)
set_light(lum, l_color = clr)
if(light_color != clr)
light_color = clr
if(light_range != lum)
set_light(lum)
/obj/machinery/power/supermatter/proc/announce_warning()
var/integrity = damage / explosion_point
integrity = round(100 - integrity * 100)
integrity = integrity < 0 ? 0 : integrity
var/alert_msg = " Integrity at [integrity]%"
if(damage > emergency_point)
alert_msg = emergency_alert + alert_msg
lastwarning = world.timeofday - WARNING_DELAY * 4
else if(damage >= damage_archived) // The damage is still going up
safe_warned = 0
alert_msg = warning_alert + alert_msg
lastwarning = world.timeofday
else if(!safe_warned)
safe_warned = 1 // We are safe, warn only once
alert_msg = safe_alert
lastwarning = world.timeofday
else
alert_msg = null
if(alert_msg)
radio.autosay(alert_msg, "Supermatter Monitor")
/obj/machinery/power/supermatter/process()
@@ -115,105 +148,85 @@
if(!istype(L)) //We are in a crate or somewhere that isn't turf, if we return to turf resume processing but for now.
return //Yeah just stop.
if(istype(L, /turf/space)) // Stop processing this stuff if we've been ejected.
return
if(damage > warning_point) // while the core is still damaged and it's still worth noting its status
shift_light(5, warning_color)
if((world.timeofday - lastwarning) / 10 >= WARNING_DELAY)
var/stability = num2text(round((damage / explosion_point) * 100))
if(damage > emergency_point)
shift_light(7, emergency_color)
radio.autosay(addtext(emergency_alert, " Instability: ",stability,"%"), "Supermatter Monitor")
lastwarning = world.timeofday
else if(damage >= damage_archived) // The damage is still going up
radio.autosay(addtext(warning_alert," Instability: ",stability,"%"), "Supermatter Monitor")
lastwarning = world.timeofday - 150
else // Phew, we're safe
radio.autosay(safe_alert, "Supermatter Monitor")
lastwarning = world.timeofday
if(damage > explosion_point)
for(var/mob/living/mob in living_mob_list)
if(loc.z == mob.loc.z)
if(istype(mob, /mob/living/carbon/human))
//Hilariously enough, running into a closet should make you get hit the hardest.
var/mob/living/carbon/human/H = mob
H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) )
var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(mob, src) + 1) )
mob.apply_effect(rads, IRRADIATE)
if(damage > explosion_point)
if(!exploded)
if(!istype(L, /turf/space))
announce_warning()
explode()
else if(damage > warning_point) // while the core is still damaged and it's still worth noting its status
shift_light(5, warning_color)
if(damage > emergency_point)
shift_light(7, emergency_color)
if(!istype(L, /turf/space) && (world.timeofday - lastwarning) >= WARNING_DELAY * 10)
announce_warning()
else
shift_light(4,initial(light_color))
if(grav_pulling)
supermatter_pull()
//Ok, get the air from the turf
var/datum/gas_mixture/env = L.return_air()
//Ok, get the air from the turf
var/datum/gas_mixture/removed = null
var/datum/gas_mixture/env = null
//Remove gas from surrounding area
var/datum/gas_mixture/removed = env.remove(gasefficency * env.total_moles())
//ensure that damage doesn't increase too quickly due to super high temperatures resulting from no coolant, for example. We dont want the SM exploding before anyone can react.
//We want the cap to scale linearly with power (and explosion_point). Let's aim for a cap of 5 at power = 300 (based on testing, equals roughly 5% per SM alert announcement).
var/damage_inc_limit = (power/300)*(explosion_point/1000)*DAMAGE_RATE_LIMIT
if(!removed || !removed.total_moles())
damage += max((power-1600)/10, 0)
power = min(power, 1600)
return 1
if(!istype(L, /turf/space))
env = L.return_air()
removed = env.remove(gasefficency * env.total_moles()) //Remove gas from surrounding area
damage_archived = damage
damage = max( damage + ( (removed.temperature - 800) / 150 ) , 0 )
//Ok, 100% oxygen atmosphere = best reaction
//Maxes out at 100% oxygen pressure
oxygen = max(min((removed.oxygen - (removed.nitrogen * NITROGEN_RETARDATION_FACTOR)) / MOLES_CELLSTANDARD, 1), 0)
var/temp_factor = 50
if(oxygen > 0.8)
// with a perfect gas mix, make the power less based on heat
icon_state = "[base_icon_state]_glow"
if(!env || !removed || !removed.total_moles())
damage += max((power - 15*POWER_FACTOR)/10, 0)
else if (grav_pulling) //If supermatter is detonating, remove all air from the zone
env.remove(env.total_moles())
else
// in normal mode, base the produced energy around the heat
temp_factor = 30
icon_state = base_icon_state
damage_archived = damage
power = max( (removed.temperature * temp_factor / T0C) * oxygen + power, 0) //Total laser power plus an overload
damage = max( damage + min( ( (removed.temperature - CRITICAL_TEMPERATURE) / 150 ), damage_inc_limit ) , 0 )
//Ok, 100% oxygen atmosphere = best reaction
//Maxes out at 100% oxygen pressure
oxygen = max(min((removed.oxygen - (removed.nitrogen * NITROGEN_RETARDATION_FACTOR)) / removed.total_moles(), 1), 0)
//We've generated power, now let's transfer it to the collectors for storing/usage
transfer_energy()
//calculate power gain for oxygen reaction
var/temp_factor
var/equilibrium_power
if (oxygen > 0.8)
//If chain reacting at oxygen == 1, we want the power at 800 K to stabilize at a power level of 400
equilibrium_power = 400
icon_state = "[base_icon_state]_glow"
else
//If chain reacting at oxygen == 1, we want the power at 800 K to stabilize at a power level of 250
equilibrium_power = 250
icon_state = base_icon_state
var/device_energy = power * REACTION_POWER_MODIFIER
temp_factor = ( (equilibrium_power/DECAY_FACTOR)**3 )/800
power = max( (removed.temperature * temp_factor) * oxygen + power, 0)
//To figure out how much temperature to add each tick, consider that at one atmosphere's worth
//of pure oxygen, with all four lasers firing at standard energy and no N2 present, at room temperature
//that the device energy is around 2140. At that stage, we don't want too much heat to be put out
//Since the core is effectively "cold"
//We've generated power, now let's transfer it to the collectors for storing/usage
transfer_energy()
//Also keep in mind we are only adding this temperature to (efficiency)% of the one tile the rock
//is on. An increase of 4*C @ 25% efficiency here results in an increase of 1*C / (#tilesincore) overall.
removed.temperature += (device_energy / THERMAL_RELEASE_MODIFIER)
var/device_energy = power * REACTION_POWER_MODIFIER
removed.temperature = max(0, min(removed.temperature, 2500))
//Calculate how much gas to release
removed.toxins += max(device_energy / PLASMA_RELEASE_MODIFIER, 0)
//Calculate how much gas to release
removed.toxins += max(device_energy / PLASMA_RELEASE_MODIFIER, 0)
removed.oxygen += max((device_energy + removed.temperature - T0C) / OXYGEN_RELEASE_MODIFIER, 0)
removed.oxygen += max((device_energy + removed.temperature - T0C) / OXYGEN_RELEASE_MODIFIER, 0)
env.merge(removed)
env.merge(removed)
for(var/mob/living/carbon/human/l in view(src, min(7, round(power ** 0.25)))) // If they can see it without mesons on. Bad on them.
for(var/mob/living/carbon/human/l in view(src, min(7, round(sqrt(power/6))))) // If they can see it without mesons on. Bad on them.
if(!istype(l.glasses, /obj/item/clothing/glasses/meson))
l.hallucination = max(0, min(200, l.hallucination + power * config_hallucination_power * sqrt( 1 / max(1, get_dist(l, src)) ) ) )
l.hallucination = max(0, min(200, l.hallucination + power * config_hallucination_power * sqrt( 1 / max(1,get_dist(l, src)) ) ) )
for(var/mob/living/l in range(src, round((power / 100) ** 0.25)))
var/rads = (power / 10) * sqrt( 1 / max(get_dist(l, src),1) )
l.apply_effect(irradiate=rads)
//adjusted range so that a power of 300 (pretty high) results in 8 tiles, roughly the distance from the core to the engine monitoring room.
for(var/mob/living/l in range(src, round(sqrt(power / 5))))
var/rads = (power / 10) * sqrt( 1 / get_dist(l, src) )
l.apply_effect(rads, IRRADIATE)
power -= (power/500)**3
power -= (power/DECAY_FACTOR)**3 //energy losses due to radiation
return 1
@@ -225,17 +238,12 @@
// Then bring it inside to explode instantly upon landing on a valid turf.
if(Proj.flag != "bullet")
power += Proj.damage * config_bullet_energy * CHARGING_FACTOR
if(istype(Proj, /obj/item/projectile/beam))
power += Proj.damage * config_bullet_energy * CHARGING_FACTOR / POWER_FACTOR
else
damage += Proj.damage * config_bullet_energy
return 0
/obj/machinery/power/supermatter/attack_paw(mob/user as mob)
return attack_hand(user)
/obj/machinery/power/supermatter/attack_robot(mob/user as mob)
if(Adjacent(user))
return attack_hand(user)
@@ -247,6 +255,9 @@
user << "<span class = \"warning\">You attempt to interface with the control circuits but find they are not connected to your network. Maybe in a future firmware update.</span>"
/obj/machinery/power/supermatter/attack_hand(mob/user as mob)
if(istype(user,/mob/living/carbon/human/nucleation)) // Nucleation's biology doesn't react to this
return
user.visible_message("<span class=\"warning\">\The [user] reaches out and touches \the [src], inducing a resonance... \his body starts to glow and bursts into flames before flashing into ash.</span>",\
"<span class=\"danger\">You reach out and touch \the [src]. Everything starts burning and all you can hear is ringing. Your last thought is \"That was not a wise decision.\"</span>",\
"<span class=\"warning\">You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.</span>")
@@ -255,11 +266,13 @@
/obj/machinery/power/supermatter/proc/transfer_energy()
for(var/obj/machinery/power/rad_collector/R in rad_collectors)
if(get_dist(R, src) <= 15) // Better than using orange() every process
R.receive_pulse(power * POWER_FACTOR)
var/distance = get_dist(R, src)
if(distance <= 15)
//for collectors using standard plasma tanks at 1013 kPa, the actual power generated will be this power*POWER_FACTOR*20*29 = power*POWER_FACTOR*580
R.receive_pulse(power * POWER_FACTOR * (min(3/distance, 1))**2)
return
/obj/machinery/power/supermatter/attackby(obj/item/weapon/W as obj, mob/living/user as mob, params)
/obj/machinery/power/supermatter/attackby(obj/item/weapon/W as obj, mob/living/carbon/user as mob)
user.visible_message("<span class=\"warning\">\The [user] touches \a [W] to \the [src] as a silence fills the room...</span>",\
"<span class=\"danger\">You touch \the [W] to \the [src] when everything suddenly goes silent.\"</span>\n<span class=\"notice\">\The [W] flashes into dust as you flinch away from \the [src].</span>",\
"<span class=\"warning\">Everything suddenly goes silent.</span>")
@@ -272,6 +285,8 @@
/obj/machinery/power/supermatter/Bumped(atom/AM as mob|obj)
if(istype(AM, /mob/living))
if(istype(AM,/mob/living/carbon/human/nucleation)) // Nucleation's biology doesn't react to this
return
AM.visible_message("<span class=\"warning\">\The [AM] slams into \the [src] inducing a resonance... \his body starts to glow and catch flame before flashing into ash.</span>",\
"<span class=\"danger\">You slam into \the [src] as your ears are filled with unearthly ringing. Your last thought is \"Oh, fuck.\"</span>",\
"<span class=\"warning\">You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.</span>")
@@ -283,6 +298,9 @@
/obj/machinery/power/supermatter/proc/Consume(var/mob/living/user)
if(istype(user,/mob/living/carbon/human/nucleation)) // Nucleation's biology doesn't react to this
return
if(istype(user))
user.dust()
power += 200
@@ -299,11 +317,10 @@
else
l.show_message("<span class=\"warning\">You hear an uneartly ringing and notice your skin is covered in fresh radiation burns.</span>", 2)
var/rads = 500 * sqrt( 1 / (get_dist(l, src) + 1) )
l.apply_effect(rads, IRRADIATE, 0) // Permit blocking
l.apply_effect(rads, IRRADIATE)
/obj/machinery/power/supermatter/proc/supermatter_pull()
//following is adapted from singulo code
if(defer_powernet_rebuild != 2)
defer_powernet_rebuild = 1
@@ -335,4 +352,110 @@
if(defer_powernet_rebuild != 2)
defer_powernet_rebuild = 0
return
return
proc/supermatter_delamination(var/turf/epicenter, var/size, var/transform_mobs = 0, var/adminlog = 1)
spawn(0)
var/start = world.timeofday
epicenter = get_turf(epicenter)
if(!epicenter) return
if(adminlog)
message_admins("Supermatter delamination with size ([size]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[epicenter.x];Y=[epicenter.y];Z=[epicenter.z]'>JMP</a>)")
log_game("Supermatter delamination with size ([size]) in area [epicenter.loc.name] ")
playsound(epicenter, 'sound/effects/explosionfar.ogg', 100, 1, round(size*2,1) )
playsound(epicenter, "explosion", 100, 1, round(size,1) )
if(defer_powernet_rebuild != 2)
defer_powernet_rebuild = 1
var/x = epicenter.x
var/y = epicenter.y
var/z = epicenter.z
epicenter.ChangeTurf( /turf/simulated/floor/plating/smatter )
for(var/mob/living/mob in orange( epicenter, size*2 )) // Irradiate area twice the size of the main blast
if(epicenter.z == mob.loc.z)
if( ishuman(mob) )
//Hilariously enough, running into a closet should make you get hit the hardest.
var/mob/living/carbon/human/H = mob
H.hallucination += max(50, min(size*10, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, epicenter) + 1)) ) )
var/rads = size*10 * sqrt( 1 / (get_dist(mob, epicenter) + 1) )
mob.apply_effect(rads, IRRADIATE)
for(var/i=0, i<size, i++) // An awful way to do this, but i'm tired
for(var/j=0, j<i, j++)
var/turf/cur_turf = locate((x-i)+j, y+j, z )
var/dist = get_dist( cur_turf, epicenter )
var/percent = min( 100, ((( size-dist )/size )*100 ))
blow_lights( cur_turf )
if( prob( percent ))
supermatter_convert( cur_turf, transform_mobs )
cur_turf = locate(x+j, (y+i)-j, z )
dist = get_dist( cur_turf, epicenter )
percent = min( 100, ((( size-dist )/size )*100 ))
blow_lights( cur_turf )
if( prob( percent ))
supermatter_convert( cur_turf, transform_mobs )
cur_turf = locate((x+i)-j, y-j, z )
dist = get_dist( cur_turf, epicenter )
percent = min( 100, ((( size-dist )/size )*100 ))
blow_lights( cur_turf )
if( prob( percent ))
supermatter_convert( cur_turf, transform_mobs )
cur_turf = locate(x-j, (y-i)+j, z )
dist = get_dist( cur_turf, epicenter )
percent = min( 100, ((( size-dist )/size )*100 ))
blow_lights( cur_turf )
if( prob( percent ))
supermatter_convert( cur_turf, transform_mobs )
if(defer_powernet_rebuild != 2)
defer_powernet_rebuild = 0
diary << "## Supermatter delamination with size [size]. Took [(world.timeofday-start)/10] seconds."
return 1
proc/supermatter_convert( var/turf/T, var/transform_mobs = 0 )
if( transform_mobs )
for( var/mob/item in T.contents )
if( ishuman( item ))
var/mob/living/carbon/human/M = item
if( istype(M.species, /datum/species/human ))
if( prob( 33 ))
M.set_species( "Nucleation", 1 )
item.ex_act( 3 )
if( istype( T, /turf/simulated/floor ))
new /obj/effect/supermatter_crystal(T)
proc/blow_lights( var/turf/T )
for( var/obj/machinery/power/apc/apc in T )
apc.overload_lighting()
/obj/machinery/power/supermatter/shard //Small subtype, less efficient and more sensitive, but less boom.
name = "Supermatter Shard"
desc = "A strangely translucent and iridescent crystal that looks like it used to be part of a larger structure. \red You get headaches just from looking at it."
icon_state = "darkmatter_shard"
base_icon_state = "darkmatter_shard"
warning_point = 50
emergency_point = 400
explosion_point = 600
gasefficency = 0.125
pull_radius = 5
pull_time = 45
explosion_power = 3
/obj/machinery/power/supermatter/shard/announce_warning() //Shards don't get announcements
return
+74
View File
@@ -0,0 +1,74 @@
/turf/simulated/floor/plating/smatter
name = "supermatter floor"
icon_state = "smatter"
light_color = "#8A8A00"
/turf/simulated/floor/plating/smatter/New()
..()
var/r = rand( 0, 3 )
icon_state = "smatter[r]"
spawn(2)
var/list/step_overlays = list("s" = NORTH, "n" = SOUTH, "w" = EAST, "e" = WEST)
for(var/direction in step_overlays)
var/turf/turf_to_check = get_step(src,step_overlays[direction])
if((istype(turf_to_check,/turf/space) || istype(turf_to_check,/turf/simulated/floor)) && !istype(turf_to_check,/turf/simulated/floor/plating/smatter))
turf_to_check.overlays += image('icons/turf/floors.dmi', "smatter_side_[direction]")
/turf/simulated/floor/plating/smatter/Del()
..()
var/list/step_overlays = list("n" = NORTH, "s" = SOUTH, "e" = EAST, "w" = WEST)
// Kill and update the space overlays around us.
for(var/direction in step_overlays)
var/turf/space/T = get_step(src, step_overlays[direction])
if(istype(T))
for(var/next_direction in step_overlays)
if(istype(get_step(T, step_overlays[next_direction]),/turf/simulated/floor/plating/smatter))
T.overlays += image('icons/turf/floors.dmi', "smatter_side_[next_direction]")
/turf/simulated/wall/smatter
name = "supermatter"
desc = "thats a wall of supermatter"
icon = 'icons/turf/walls.dmi'
icon_state = "smatter"
temperature = T20C+80
density = 1
opacity = 1
blocks_air = 1
/turf/simulated/smatter/New()
..()
name = "supermatter"
desc = "thats a wall of supermatter"
icon = 'icons/turf/walls.dmi'
icon_state = "smatter"
temperature = T20C+80
density = 1
opacity = 1
blocks_air = 1
spawn(2)
var/list/step_overlays = list("s" = NORTH, "n" = SOUTH, "w" = EAST, "e" = WEST)
for(var/direction in step_overlays)
var/turf/turf_to_check = get_step(src,step_overlays[direction])
if(istype(turf_to_check,/turf/space) || istype(turf_to_check,/turf/simulated/floor))
turf_to_check.overlays += image('icons/turf/walls.dmi', "smatter_side_[direction]")
/turf/simulated/smatter/Del()
..()
var/list/step_overlays = list("n" = NORTH, "s" = SOUTH, "e" = EAST, "w" = WEST)
// Kill and update the space overlays around us.
for(var/direction in step_overlays)
var/turf/space/T = get_step(src, step_overlays[direction])
if(istype(T))
T.overlays.Cut()
for(var/next_direction in step_overlays)
if(istype(get_step(T, step_overlays[next_direction]),/turf/simulated/wall/smatter))
T.overlays += image('icons/turf/walls.dmi', "smatter_side_[next_direction]")
Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 24 KiB

+4
View File
@@ -574,6 +574,7 @@
#include "code\game\objects\effects\misc.dm"
#include "code\game\objects\effects\overlays.dm"
#include "code\game\objects\effects\portals.dm"
#include "code\game\objects\effects\sm_crystals.dm"
#include "code\game\objects\effects\spiders.dm"
#include "code\game\objects\effects\step_triggers.dm"
#include "code\game\objects\effects\decals\cleanable.dm"
@@ -706,6 +707,7 @@
#include "code\game\objects\items\weapons\shards.dm"
#include "code\game\objects\items\weapons\shields.dm"
#include "code\game\objects\items\weapons\signs.dm"
#include "code\game\objects\items\weapons\sm_shard.dm"
#include "code\game\objects\items\weapons\soap.dm"
#include "code\game\objects\items\weapons\staff.dm"
#include "code\game\objects\items\weapons\stock_parts.dm"
@@ -1299,6 +1301,7 @@
#include "code\modules\mob\living\carbon\human\say.dm"
#include "code\modules\mob\living\carbon\human\update_icons.dm"
#include "code\modules\mob\living\carbon\human\whisper.dm"
#include "code\modules\mob\living\carbon\human\species\apollo.dm"
#include "code\modules\mob\living\carbon\human\species\golem.dm"
#include "code\modules\mob\living\carbon\human\species\plasmaman.dm"
#include "code\modules\mob\living\carbon\human\species\shadow.dm"
@@ -1722,6 +1725,7 @@
#include "code\modules\store\items.dm"
#include "code\modules\store\store.dm"
#include "code\modules\supermatter\supermatter.dm"
#include "code\modules\supermatter\wall.dm"
#include "code\modules\surgery\bones.dm"
#include "code\modules\surgery\brainrepair.dm"
#include "code\modules\surgery\encased.dm"
Binary file not shown.
Binary file not shown.