mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-12 23:53:47 +01:00
Merge remote-tracking branch 'origin/master' into bay_examine
# Conflicts: # code/game/objects/structures/displaycase.dm
This commit is contained in:
+11
-7
@@ -42,13 +42,17 @@
|
||||
#define NO_PAIN 32
|
||||
#define REQUIRE_LIGHT 64
|
||||
#define IS_WHITELISTED 128
|
||||
#define HAS_LIPS 512
|
||||
#define HAS_UNDERWEAR 1024
|
||||
#define IS_PLANT 2048
|
||||
#define CAN_BE_FAT 4096
|
||||
#define IS_RESTRICTED 8192
|
||||
#define NO_INTORGANS 16384
|
||||
#define NO_POISON 32768
|
||||
#define HAS_LIPS 256
|
||||
#define IS_PLANT 512
|
||||
#define CAN_BE_FAT 1024
|
||||
#define IS_RESTRICTED 2048
|
||||
#define NO_INTORGANS 4096
|
||||
#define NO_POISON 8192
|
||||
|
||||
//Species clothing flags
|
||||
#define HAS_UNDERWEAR 1
|
||||
#define HAS_UNDERSHIRT 2
|
||||
#define HAS_SOCKS 4
|
||||
|
||||
//Species Blood Flags
|
||||
#define BLOOD_SLIME 1
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
|
||||
|
||||
/*
|
||||
@@ -1765,3 +1766,38 @@ var/mob/dview/dview_mob = new
|
||||
if(orbiting)
|
||||
loc = get_turf(orbiting)
|
||||
orbiting = null
|
||||
|
||||
//Centers an image.
|
||||
//Requires:
|
||||
//The Image
|
||||
//The x dimension of the icon file used in the image
|
||||
//The y dimension of the icon file used in the image
|
||||
// eg: center_image(I, 32,32)
|
||||
// eg2: center_image(I, 96,96)
|
||||
/proc/center_image(var/image/I, x_dimension = 0, y_dimension = 0)
|
||||
if(!I)
|
||||
return
|
||||
|
||||
if(!x_dimension || !y_dimension)
|
||||
return
|
||||
|
||||
//Get out of here, punk ass kids calling procs needlessly
|
||||
if((x_dimension == world.icon_size) && (y_dimension == world.icon_size))
|
||||
return I
|
||||
|
||||
//Offset the image so that it's bottom left corner is shifted this many pixels
|
||||
//This makes it infinitely easier to draw larger inhands/images larger than world.iconsize
|
||||
//but still use them in game
|
||||
var/x_offset = -((x_dimension/world.icon_size)-1)*(world.icon_size*0.5)
|
||||
var/y_offset = -((y_dimension/world.icon_size)-1)*(world.icon_size*0.5)
|
||||
|
||||
//Correct values under world.icon_size
|
||||
if(x_dimension < world.icon_size)
|
||||
x_offset *= -1
|
||||
if(y_dimension < world.icon_size)
|
||||
y_offset *= -1
|
||||
|
||||
I.pixel_x = x_offset
|
||||
I.pixel_y = y_offset
|
||||
|
||||
return I
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
// We manually initialize the alarm handlers instead of looping over all existing types
|
||||
// to make it possible to write: camera.triggerAlarm() rather than alarm_manager.managers[datum/alarm_handler/camera].triggerAlarm() or a variant thereof.
|
||||
/var/global/datum/alarm_handler/atmosphere/atmosphere_alarm = new()
|
||||
/var/global/datum/alarm_handler/burglar/burglar_alarm = new()
|
||||
/var/global/datum/alarm_handler/camera/camera_alarm = new()
|
||||
/var/global/datum/alarm_handler/fire/fire_alarm = new()
|
||||
/var/global/datum/alarm_handler/motion/motion_alarm = new()
|
||||
@@ -15,7 +16,7 @@ var/datum/controller/process/alarm/alarm_manager
|
||||
/datum/controller/process/alarm/setup()
|
||||
name = "alarm"
|
||||
schedule_interval = 20 // every 2 seconds
|
||||
all_handlers = list(atmosphere_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm)
|
||||
all_handlers = list(atmosphere_alarm, burglar_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm)
|
||||
alarm_manager = src
|
||||
|
||||
/datum/controller/process/alarm/doWork()
|
||||
|
||||
@@ -92,3 +92,10 @@
|
||||
* Parameters: var/obj/structure/closet/crate/sold, var/area/shuttle
|
||||
*/
|
||||
/hook/sell_crate
|
||||
|
||||
/**
|
||||
* Captain spawned hook.
|
||||
* Called in supervisor.dm when a captain spawns
|
||||
* Parameters: var/mob/living/carbon/human/captain
|
||||
*/
|
||||
/hook/captain_spawned
|
||||
|
||||
@@ -520,7 +520,6 @@
|
||||
throwforce = 20
|
||||
attack_verb = list("smashed", "slammed", "whacked", "thwacked")
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_override = 'icons/mob/in-hand/staff.dmi'
|
||||
icon_state = "bostaff0"
|
||||
|
||||
|
||||
|
||||
+14
-15
@@ -217,7 +217,6 @@ var/list/uplink_items = list()
|
||||
cost = 12
|
||||
job = list("Research Director")
|
||||
|
||||
|
||||
//Stimulants
|
||||
|
||||
/datum/uplink_item/jobspecific/stims
|
||||
@@ -245,14 +244,14 @@ var/list/uplink_items = list()
|
||||
|
||||
|
||||
/datum/uplink_item/dangerous/pistol
|
||||
name = "Syndicate Pistol"
|
||||
name = "FK-69 Pistol"
|
||||
reference = "SPI"
|
||||
desc = "A small, easily concealable handgun that uses 10mm auto rounds in 8-round magazines and is compatible with suppressors."
|
||||
item = /obj/item/weapon/gun/projectile/automatic/pistol
|
||||
cost = 9
|
||||
|
||||
/datum/uplink_item/dangerous/revolver
|
||||
name = "Syndicate Revolver"
|
||||
name = "Syndicate .357 Revolver"
|
||||
reference = "SR"
|
||||
desc = "A brutally simple syndicate revolver that fires .357 Magnum cartridges and has 7 chambers."
|
||||
item = /obj/item/weapon/gun/projectile/revolver
|
||||
@@ -260,7 +259,7 @@ var/list/uplink_items = list()
|
||||
surplus = 50
|
||||
|
||||
/datum/uplink_item/dangerous/smg
|
||||
name = "Syndicate SMG"
|
||||
name = "C-20r Submachine Gun"
|
||||
reference = "SMG"
|
||||
desc = "A fully-loaded Scarborough Arms bullpup submachine gun that fires .45 rounds with a 20-round magazine and is compatible with suppressors."
|
||||
item = /obj/item/weapon/gun/projectile/automatic/c20r
|
||||
@@ -268,17 +267,17 @@ var/list/uplink_items = list()
|
||||
gamemodes = list("nuclear emergency")
|
||||
surplus = 40
|
||||
|
||||
/datum/uplink_item/dangerous/car
|
||||
name = "C-90gl Compact Assault Rifle"
|
||||
desc = "A fully-loaded Zashchita Industriya toploading bullpup assault rifle that uses 30-round 5.45x39mm magazines with a toggleable underslung 40mm grenade launcher."
|
||||
/datum/uplink_item/dangerous/carbine
|
||||
name = "M-90gl Carbine"
|
||||
desc = "A fully-loaded three-round burst carbine that uses 30-round 5.56mm magazines with a togglable underslung 40mm grenade launcher."
|
||||
reference = "AR"
|
||||
item = /obj/item/weapon/gun/projectile/automatic/c90gl
|
||||
item = /obj/item/weapon/gun/projectile/automatic/m90
|
||||
cost = 18
|
||||
gamemodes = list("nuclear emergency")
|
||||
surplus = 50
|
||||
|
||||
/datum/uplink_item/dangerous/machinegun
|
||||
name = "Syndicate LMG"
|
||||
name = "L6 Squad Automatic Weapon"
|
||||
desc = "A fully-loaded Aussec Armoury belt-fed machine gun. This deadly weapon has a massive 50-round magazine of devastating 7.62x51mm ammunition."
|
||||
reference = "LMG"
|
||||
item = /obj/item/weapon/gun/projectile/automatic/l6_saw
|
||||
@@ -399,7 +398,7 @@ var/list/uplink_items = list()
|
||||
surplus = 40
|
||||
|
||||
/datum/uplink_item/ammo/pistol
|
||||
name = "Ammo-10mm"
|
||||
name = "Magazine - 10mm"
|
||||
desc = "An additional 8-round 10mm magazine for use in the syndicate pistol. These subsonic rounds are dirt cheap but are half as effective as .357 rounds."
|
||||
reference = "10MM"
|
||||
item = /obj/item/ammo_box/magazine/m10mm
|
||||
@@ -460,11 +459,11 @@ var/list/uplink_items = list()
|
||||
cost = 2
|
||||
gamemodes = list("nuclear emergency")
|
||||
|
||||
/datum/uplink_item/ammo/car
|
||||
name = "Box Magazine - 5.45x39mm"
|
||||
desc = "An additional 30-round 5.45x39mm magazine for use in the C-90gl assault rifle. These bullets don't have the punch to knock most targets down, but dish out higher overall damage."
|
||||
reference = "545"
|
||||
item = /obj/item/ammo_box/magazine/m545
|
||||
/datum/uplink_item/ammo/carbine
|
||||
name = "Toploader Magazine - 5.56"
|
||||
desc = "An additional 30-round 5.56 magazine for use in the M-90gl carbine. These bullets don't have the punch to knock most targets down, but dish out higher overall damage."
|
||||
reference = "556"
|
||||
item = /obj/item/ammo_box/magazine/m556
|
||||
cost = 2
|
||||
gamemodes = list("nuclear emergency")
|
||||
|
||||
|
||||
@@ -108,6 +108,31 @@
|
||||
updateicon()
|
||||
mouse_opacity = 0
|
||||
air_doors_open()
|
||||
|
||||
return
|
||||
|
||||
/area/proc/burglaralert(var/obj/trigger)
|
||||
if(always_unpowered == 1) //no burglar alarms in space/asteroid
|
||||
return
|
||||
|
||||
//Trigger alarm effect
|
||||
set_fire_alarm_effect()
|
||||
|
||||
//Lockdown airlocks
|
||||
for(var/obj/machinery/door/airlock/A in src)
|
||||
spawn(0)
|
||||
A.close()
|
||||
if(A.density)
|
||||
A.lock()
|
||||
|
||||
burglar_alarm.triggerAlarm(src, trigger)
|
||||
spawn(600)
|
||||
burglar_alarm.clearAlarm(src, trigger)
|
||||
|
||||
/area/proc/set_fire_alarm_effect()
|
||||
fire = 1
|
||||
updateicon()
|
||||
mouse_opacity = 0
|
||||
|
||||
/area/proc/readyalert()
|
||||
if(!eject)
|
||||
|
||||
+8
-1
@@ -12,6 +12,7 @@
|
||||
var/throwpass = 0
|
||||
var/germ_level = GERM_LEVEL_AMBIENT // The higher the germ level, the more germ on the atom.
|
||||
var/simulated = 1 //filter for actions - used by lighting overlays
|
||||
var/atom_say_verb = "says"
|
||||
|
||||
///Chemistry.
|
||||
var/datum/reagents/reagents = null
|
||||
@@ -346,7 +347,7 @@ its easier to just keep the beam vertical.
|
||||
fingerprints = list()
|
||||
|
||||
//Hash this shit.
|
||||
var/full_print = md5(H.dna.uni_identity)
|
||||
var/full_print = H.get_full_print()
|
||||
|
||||
// Add the fingerprints
|
||||
fingerprints[full_print] = full_print
|
||||
@@ -455,3 +456,9 @@ its easier to just keep the beam vertical.
|
||||
|
||||
/atom/proc/narsie_act()
|
||||
return
|
||||
|
||||
/atom/proc/atom_say(var/message)
|
||||
if((!message))
|
||||
return
|
||||
for(var/mob/O in hearers(src, null))
|
||||
O.show_message("<span class='game say'><span class='name'>[src]</span> [atom_say_verb], \"[message]\"</span>",2)
|
||||
@@ -1,128 +0,0 @@
|
||||
/////////////////////////// DNA DATUM
|
||||
/datum/dna
|
||||
var/unique_enzymes = null
|
||||
var/struc_enzymes = null
|
||||
var/uni_identity = null
|
||||
var/b_type = "A+"
|
||||
var/mutantrace = null //The type of mutant race the player is if applicable (i.e. potato-man)
|
||||
var/real_name //Stores the real name of the person who originally got this dna datum. Used primarely for changelings,
|
||||
|
||||
/datum/dna/proc/check_integrity(var/mob/living/carbon/human/character)
|
||||
if(character)
|
||||
if(length(uni_identity) != 39)
|
||||
//Lazy.
|
||||
var/temp
|
||||
|
||||
//Hair
|
||||
var/hair = 0
|
||||
if(!character.h_style)
|
||||
character.h_style = "Skinhead"
|
||||
|
||||
var/hrange = round(4095 / hair_styles_list.len)
|
||||
var/index = hair_styles_list.Find(character.h_style)
|
||||
if(index)
|
||||
hair = index * hrange - rand(1,hrange-1)
|
||||
|
||||
//Facial Hair
|
||||
var/beard = 0
|
||||
if(!character.f_style)
|
||||
character.f_style = "Shaved"
|
||||
|
||||
var/f_hrange = round(4095 / facial_hair_styles_list.len)
|
||||
index = facial_hair_styles_list.Find(character.f_style)
|
||||
if(index)
|
||||
beard = index * f_hrange - rand(1,f_hrange-1)
|
||||
|
||||
temp = add_zero2(num2hex((character.r_hair),1), 3)
|
||||
temp += add_zero2(num2hex((character.b_hair),1), 3)
|
||||
temp += add_zero2(num2hex((character.g_hair),1), 3)
|
||||
temp += add_zero2(num2hex((character.r_facial),1), 3)
|
||||
temp += add_zero2(num2hex((character.b_facial),1), 3)
|
||||
temp += add_zero2(num2hex((character.g_facial),1), 3)
|
||||
temp += add_zero2(num2hex(((character.s_tone + 220) * 16),1), 3)
|
||||
temp += add_zero2(num2hex((character.r_eyes),1), 3)
|
||||
temp += add_zero2(num2hex((character.g_eyes),1), 3)
|
||||
temp += add_zero2(num2hex((character.b_eyes),1), 3)
|
||||
|
||||
var/gender
|
||||
|
||||
if (character.gender == MALE)
|
||||
gender = add_zero2(num2hex((rand(1,(2050+BLOCKADD))),1), 3)
|
||||
else
|
||||
gender = add_zero2(num2hex((rand((2051+BLOCKADD),4094)),1), 3)
|
||||
|
||||
temp += gender
|
||||
temp += add_zero2(num2hex((beard),1), 3)
|
||||
temp += add_zero2(num2hex((hair),1), 3)
|
||||
|
||||
uni_identity = temp
|
||||
if(length(struc_enzymes)!= 3*STRUCDNASIZE)
|
||||
var/mutstring = ""
|
||||
for(var/i = 1, i <= STRUCDNASIZE, i++)
|
||||
mutstring += add_zero2(num2hex(rand(1,1024)),3)
|
||||
|
||||
struc_enzymes = mutstring
|
||||
if(length(unique_enzymes) != 32)
|
||||
unique_enzymes = md5(character.real_name)
|
||||
else
|
||||
if(length(uni_identity) != 39) uni_identity = "00600200A00E0110148FC01300B0095BD7FD3F4"
|
||||
if(length(struc_enzymes)!= 3*STRUCDNASIZE) struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6"
|
||||
|
||||
/datum/dna/proc/ready_dna(mob/living/carbon/human/character)
|
||||
var/temp
|
||||
|
||||
//Hair
|
||||
var/hair = 0
|
||||
if(!character.h_style)
|
||||
character.h_style = random_hair_style(character.gender)
|
||||
|
||||
var/hrange = round(4095 / hair_styles_list.len)
|
||||
var/index = hair_styles_list.Find(character.h_style)
|
||||
if(index)
|
||||
hair = index * hrange - rand(1,hrange-1)
|
||||
|
||||
//Facial Hair
|
||||
var/beard = 0
|
||||
if(!character.f_style)
|
||||
character.f_style = random_facial_hair_style(character.gender)
|
||||
|
||||
var/f_hrange = round(4095 / facial_hair_styles_list.len)
|
||||
index = facial_hair_styles_list.Find(character.f_style)
|
||||
if(index)
|
||||
beard = index * f_hrange - rand(1,f_hrange-1)
|
||||
|
||||
temp = add_zero2(num2hex((character.r_hair),1), 3)
|
||||
temp += add_zero2(num2hex((character.b_hair),1), 3)
|
||||
temp += add_zero2(num2hex((character.g_hair),1), 3)
|
||||
temp += add_zero2(num2hex((character.r_facial),1), 3)
|
||||
temp += add_zero2(num2hex((character.b_facial),1), 3)
|
||||
temp += add_zero2(num2hex((character.g_facial),1), 3)
|
||||
temp += add_zero2(num2hex(((character.s_tone + 220) * 16),1), 3)
|
||||
temp += add_zero2(num2hex((character.r_eyes),1), 3)
|
||||
temp += add_zero2(num2hex((character.g_eyes),1), 3)
|
||||
temp += add_zero2(num2hex((character.b_eyes),1), 3)
|
||||
|
||||
var/gender
|
||||
|
||||
if (character.gender == MALE)
|
||||
gender = add_zero2(num2hex((rand(1,(2050+BLOCKADD))),1), 3)
|
||||
else
|
||||
gender = add_zero2(num2hex((rand((2051+BLOCKADD),4094)),1), 3)
|
||||
|
||||
temp += gender
|
||||
temp += add_zero2(num2hex((beard),1), 3)
|
||||
temp += add_zero2(num2hex((hair),1), 3)
|
||||
|
||||
uni_identity = temp
|
||||
|
||||
var/mutstring = ""
|
||||
for(var/i = 1, i <= STRUCDNASIZE, i++)
|
||||
mutstring += add_zero2(num2hex(rand(1,1024)),3)
|
||||
|
||||
|
||||
struc_enzymes = mutstring
|
||||
|
||||
unique_enzymes = md5(character.real_name)
|
||||
reg_dna[unique_enzymes] = character.real_name
|
||||
|
||||
/////////////////////////// DNA DATUM
|
||||
@@ -1,575 +0,0 @@
|
||||
/////////////////////////// DNA HELPER-PROCS
|
||||
/proc/getleftblocks(input,blocknumber,blocksize)
|
||||
var/string
|
||||
|
||||
if (blocknumber > 1)
|
||||
string = copytext(input,1,((blocksize*blocknumber)-(blocksize-1)))
|
||||
return string
|
||||
else
|
||||
return null
|
||||
|
||||
/proc/getrightblocks(input,blocknumber,blocksize)
|
||||
var/string
|
||||
if (blocknumber < (length(input)/blocksize))
|
||||
string = copytext(input,blocksize*blocknumber+1,length(input)+1)
|
||||
return string
|
||||
else
|
||||
return null
|
||||
|
||||
/proc/getblockstring(input,block,subblock,blocksize,src,ui) // src is probably used here just for urls; ui is 1 when requesting for the unique identifier screen, 0 for structural enzymes screen
|
||||
var/string
|
||||
var/subpos = 1 // keeps track of the current sub block
|
||||
var/blockpos = 1 // keeps track of the current block
|
||||
|
||||
|
||||
for(var/i = 1, i <= length(input), i++) // loop through each letter
|
||||
|
||||
var/pushstring
|
||||
|
||||
if(subpos == subblock && blockpos == block) // if the current block/subblock is selected, mark it
|
||||
pushstring = "</font color><b>[copytext(input, i, i+1)]</b><font color='blue'>"
|
||||
else
|
||||
if(ui) //This is for allowing block clicks to be differentiated
|
||||
pushstring = "<a href='?src=\ref[src];uimenuset=[num2text(blockpos)];uimenusubset=[num2text(subpos)]'>[copytext(input, i, i+1)]</a>"
|
||||
else
|
||||
pushstring = "<a href='?src=\ref[src];semenuset=[num2text(blockpos)];semenusubset=[num2text(subpos)]'>[copytext(input, i, i+1)]</a>"
|
||||
|
||||
string += pushstring // push the string to the return string
|
||||
|
||||
if(subpos >= blocksize) // add a line break for every block
|
||||
string += " </font color><font color='#285B5B'>|</font color><font color='blue'> "
|
||||
subpos = 0
|
||||
blockpos++
|
||||
|
||||
subpos++
|
||||
|
||||
return string
|
||||
|
||||
|
||||
/proc/getblock(input,blocknumber,blocksize)
|
||||
var/result
|
||||
result = copytext(input ,(blocksize*blocknumber)-(blocksize-1),(blocksize*blocknumber)+1)
|
||||
return result
|
||||
|
||||
/proc/getblockbuffer(input,blocknumber,blocksize)
|
||||
var/result[3]
|
||||
var/block = copytext(input ,(blocksize*blocknumber)-(blocksize-1),(blocksize*blocknumber)+1)
|
||||
for(var/i = 1, i <= 3, i++)
|
||||
result[i] = copytext(block, i, i+1)
|
||||
return result
|
||||
|
||||
/proc/setblock(istring, blocknumber, replacement, blocksize)
|
||||
if(!blocknumber)
|
||||
return istring
|
||||
if(!istring || !replacement || !blocksize) return 0
|
||||
var/result = getleftblocks(istring, blocknumber, blocksize) + replacement + getrightblocks(istring, blocknumber, blocksize)
|
||||
return result
|
||||
|
||||
/proc/add_zero2(t, u)
|
||||
var/temp1
|
||||
while (length(t) < u)
|
||||
t = "0[t]"
|
||||
temp1 = t
|
||||
if (length(t) > u)
|
||||
temp1 = copytext(t,2,u+1)
|
||||
return temp1
|
||||
|
||||
/proc/miniscramble(input,rs,rd)
|
||||
var/output
|
||||
output = null
|
||||
if (input == "C" || input == "D" || input == "E" || input == "F")
|
||||
output = pick(prob((rs*10));"4",prob((rs*10));"5",prob((rs*10));"6",prob((rs*10));"7",prob((rs*5)+(rd));"0",prob((rs*5)+(rd));"1",prob((rs*10)-(rd));"2",prob((rs*10)-(rd));"3")
|
||||
if (input == "8" || input == "9" || input == "A" || input == "B")
|
||||
output = pick(prob((rs*10));"4",prob((rs*10));"5",prob((rs*10));"A",prob((rs*10));"B",prob((rs*5)+(rd));"C",prob((rs*5)+(rd));"D",prob((rs*5)+(rd));"2",prob((rs*5)+(rd));"3")
|
||||
if (input == "4" || input == "5" || input == "6" || input == "7")
|
||||
output = pick(prob((rs*10));"4",prob((rs*10));"5",prob((rs*10));"A",prob((rs*10));"B",prob((rs*5)+(rd));"C",prob((rs*5)+(rd));"D",prob((rs*5)+(rd));"2",prob((rs*5)+(rd));"3")
|
||||
if (input == "0" || input == "1" || input == "2" || input == "3")
|
||||
output = pick(prob((rs*10));"8",prob((rs*10));"9",prob((rs*10));"A",prob((rs*10));"B",prob((rs*10)-(rd));"C",prob((rs*10)-(rd));"D",prob((rs*5)+(rd));"E",prob((rs*5)+(rd));"F")
|
||||
if (!output) output = "5"
|
||||
return output
|
||||
|
||||
//Instead of picking a value far from the input, this will pick values closer to it.
|
||||
//Sorry for the block of code, but it's more efficient then calling text2hex -> loop -> hex2text
|
||||
/proc/miniscrambletarget(input,rs,rd)
|
||||
var/output = null
|
||||
switch(input)
|
||||
if("0")
|
||||
output = pick(prob((rs*10)+(rd));"0",prob((rs*10)+(rd));"1",prob((rs*10));"2",prob((rs*10)-(rd));"3")
|
||||
if("1")
|
||||
output = pick(prob((rs*10)+(rd));"0",prob((rs*10)+(rd));"1",prob((rs*10)+(rd));"2",prob((rs*10));"3",prob((rs*10)-(rd));"4")
|
||||
if("2")
|
||||
output = pick(prob((rs*10));"0",prob((rs*10)+(rd));"1",prob((rs*10)+(rd));"2",prob((rs*10)+(rd));"3",prob((rs*10));"4",prob((rs*10)-(rd));"5")
|
||||
if("3")
|
||||
output = pick(prob((rs*10)-(rd));"0",prob((rs*10));"1",prob((rs*10)+(rd));"2",prob((rs*10)+(rd));"3",prob((rs*10)+(rd));"4",prob((rs*10));"5",prob((rs*10)-(rd));"6")
|
||||
if("4")
|
||||
output = pick(prob((rs*10)-(rd));"1",prob((rs*10));"2",prob((rs*10)+(rd));"3",prob((rs*10)+(rd));"4",prob((rs*10)+(rd));"5",prob((rs*10));"6",prob((rs*10)-(rd));"7")
|
||||
if("5")
|
||||
output = pick(prob((rs*10)-(rd));"2",prob((rs*10));"3",prob((rs*10)+(rd));"4",prob((rs*10)+(rd));"5",prob((rs*10)+(rd));"6",prob((rs*10));"7",prob((rs*10)-(rd));"8")
|
||||
if("6")
|
||||
output = pick(prob((rs*10)-(rd));"3",prob((rs*10));"4",prob((rs*10)+(rd));"5",prob((rs*10)+(rd));"6",prob((rs*10)+(rd));"7",prob((rs*10));"8",prob((rs*10)-(rd));"9")
|
||||
if("7")
|
||||
output = pick(prob((rs*10)-(rd));"4",prob((rs*10));"5",prob((rs*10)+(rd));"6",prob((rs*10)+(rd));"7",prob((rs*10)+(rd));"8",prob((rs*10));"9",prob((rs*10)-(rd));"A")
|
||||
if("8")
|
||||
output = pick(prob((rs*10)-(rd));"5",prob((rs*10));"6",prob((rs*10)+(rd));"7",prob((rs*10)+(rd));"8",prob((rs*10)+(rd));"9",prob((rs*10));"A",prob((rs*10)-(rd));"B")
|
||||
if("9")
|
||||
output = pick(prob((rs*10)-(rd));"6",prob((rs*10));"7",prob((rs*10)+(rd));"8",prob((rs*10)+(rd));"9",prob((rs*10)+(rd));"A",prob((rs*10));"B",prob((rs*10)-(rd));"C")
|
||||
if("10")//A
|
||||
output = pick(prob((rs*10)-(rd));"7",prob((rs*10));"8",prob((rs*10)+(rd));"9",prob((rs*10)+(rd));"A",prob((rs*10)+(rd));"B",prob((rs*10));"C",prob((rs*10)-(rd));"D")
|
||||
if("11")//B
|
||||
output = pick(prob((rs*10)-(rd));"8",prob((rs*10));"9",prob((rs*10)+(rd));"A",prob((rs*10)+(rd));"B",prob((rs*10)+(rd));"C",prob((rs*10));"D",prob((rs*10)-(rd));"E")
|
||||
if("12")//C
|
||||
output = pick(prob((rs*10)-(rd));"9",prob((rs*10));"A",prob((rs*10)+(rd));"B",prob((rs*10)+(rd));"C",prob((rs*10)+(rd));"D",prob((rs*10));"E",prob((rs*10)-(rd));"F")
|
||||
if("13")//D
|
||||
output = pick(prob((rs*10)-(rd));"A",prob((rs*10));"B",prob((rs*10)+(rd));"C",prob((rs*10)+(rd));"D",prob((rs*10)+(rd));"E",prob((rs*10));"F")
|
||||
if("14")//E
|
||||
output = pick(prob((rs*10)-(rd));"B",prob((rs*10));"C",prob((rs*10)+(rd));"D",prob((rs*10)+(rd));"E",prob((rs*10)+(rd));"F")
|
||||
if("15")//F
|
||||
output = pick(prob((rs*10)-(rd));"C",prob((rs*10));"D",prob((rs*10)+(rd));"E",prob((rs*10)+(rd));"F")
|
||||
|
||||
if(!input || !output) //How did this happen?
|
||||
output = "8"
|
||||
|
||||
return output
|
||||
|
||||
/proc/isblockon(hnumber, bnumber , var/UI = 0)
|
||||
|
||||
var/temp2
|
||||
temp2 = hex2num(hnumber)
|
||||
|
||||
if(UI)
|
||||
if(temp2 >= 2050)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
if (bnumber == HULKBLOCK || bnumber == TELEBLOCK || bnumber == NOBREATHBLOCK || bnumber == NOPRINTSBLOCK || bnumber == SMALLSIZEBLOCK || bnumber == SHOCKIMMUNITYBLOCK)
|
||||
if (temp2 >= 3500 + BLOCKADD)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
if (bnumber == XRAYBLOCK || bnumber == FIREBLOCK || bnumber == REMOTEVIEWBLOCK || bnumber == REGENERATEBLOCK || bnumber == INCREASERUNBLOCK || bnumber == REMOTETALKBLOCK || bnumber == MORPHBLOCK)
|
||||
if (temp2 >= 3050 + BLOCKADD)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
|
||||
if (temp2 >= 2050 + BLOCKADD)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
/proc/ismuton(var/block,var/mob/M)
|
||||
return isblockon(getblock(M.dna.struc_enzymes, block,3),block)
|
||||
|
||||
/proc/randmutb(mob/M as mob)
|
||||
if(!M) return
|
||||
var/num
|
||||
var/newdna
|
||||
num = pick(GLASSESBLOCK,COUGHBLOCK,FAKEBLOCK,NERVOUSBLOCK,CLUMSYBLOCK,TWITCHBLOCK,HEADACHEBLOCK,BLINDBLOCK,DEAFBLOCK,HALLUCINATIONBLOCK)
|
||||
M.dna.check_integrity()
|
||||
newdna = setblock(M.dna.struc_enzymes,num,toggledblock(getblock(M.dna.struc_enzymes,num,3)),3)
|
||||
M.dna.struc_enzymes = newdna
|
||||
return
|
||||
|
||||
/proc/randmutg(mob/M as mob)
|
||||
if(!M) return
|
||||
var/num
|
||||
var/newdna
|
||||
num = pick(HULKBLOCK,XRAYBLOCK,FIREBLOCK,TELEBLOCK,NOBREATHBLOCK,REMOTEVIEWBLOCK,REGENERATEBLOCK,INCREASERUNBLOCK,REMOTETALKBLOCK,MORPHBLOCK,BLENDBLOCK,NOPRINTSBLOCK,SHOCKIMMUNITYBLOCK,SMALLSIZEBLOCK)
|
||||
M.dna.check_integrity()
|
||||
newdna = setblock(M.dna.struc_enzymes,num,toggledblock(getblock(M.dna.struc_enzymes,num,3)),3)
|
||||
M.dna.struc_enzymes = newdna
|
||||
return
|
||||
|
||||
/proc/scramble(var/type, mob/M as mob, var/p)
|
||||
if(!M) return
|
||||
M.dna.check_integrity()
|
||||
if(type)
|
||||
for(var/i = 1, i <= STRUCDNASIZE-1, i++)
|
||||
if(prob(p))
|
||||
M.dna.uni_identity = setblock(M.dna.uni_identity, i, add_zero2(num2hex(rand(1,4095), 1), 3), 3)
|
||||
updateappearance(M, M.dna.uni_identity)
|
||||
|
||||
else
|
||||
for(var/i = 1, i <= STRUCDNASIZE-1, i++)
|
||||
if(prob(p))
|
||||
M.dna.struc_enzymes = setblock(M.dna.struc_enzymes, i, add_zero2(num2hex(rand(1,4095), 1), 3), 3)
|
||||
domutcheck(M, null)
|
||||
return
|
||||
|
||||
/proc/randmuti(mob/M as mob)
|
||||
if(!M) return
|
||||
var/num
|
||||
var/newdna
|
||||
num = rand(1,UNIDNASIZE)
|
||||
M.dna.check_integrity()
|
||||
newdna = setblock(M.dna.uni_identity,num,add_zero2(num2hex(rand(1,4095),1),3),3)
|
||||
M.dna.uni_identity = newdna
|
||||
return
|
||||
|
||||
/proc/toggledblock(hnumber) //unused
|
||||
var/temp3
|
||||
var/chtemp
|
||||
temp3 = hex2num(hnumber)
|
||||
if (temp3 < 2050)
|
||||
chtemp = rand(2050,4095)
|
||||
return add_zero2(num2hex(chtemp,1),3)
|
||||
else
|
||||
chtemp = rand(1,2049)
|
||||
return add_zero2(num2hex(chtemp,1),3)
|
||||
/////////////////////////// DNA HELPER-PROCS
|
||||
|
||||
/////////////////////////// DNA MISC-PROCS
|
||||
/proc/updateappearance(mob/M as mob , structure)
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
M.dna.check_integrity()
|
||||
var/mob/living/carbon/human/H = M
|
||||
H.r_hair = hex2num(getblock(structure,1,3))
|
||||
H.b_hair = hex2num(getblock(structure,2,3))
|
||||
H.g_hair = hex2num(getblock(structure,3,3))
|
||||
H.r_facial = hex2num(getblock(structure,4,3))
|
||||
H.b_facial = hex2num(getblock(structure,5,3))
|
||||
H.g_facial = hex2num(getblock(structure,6,3))
|
||||
H.s_tone = round(((hex2num(getblock(structure,7,3)) / 16) - 220))
|
||||
H.r_eyes = hex2num(getblock(structure,8,3))
|
||||
H.g_eyes = hex2num(getblock(structure,9,3))
|
||||
H.b_eyes = hex2num(getblock(structure,10,3))
|
||||
if(H.internal_organs_by_name["eyes"])
|
||||
H.update_eyes()
|
||||
|
||||
if (isblockon(getblock(structure, 11,3),11 , 1))
|
||||
H.gender = FEMALE
|
||||
else
|
||||
H.gender = MALE
|
||||
|
||||
//Hair
|
||||
var/hairnum = hex2num(getblock(structure,13,3))
|
||||
var/index = round(1 +(hairnum / 4096)*hair_styles_list.len)
|
||||
if((0 < index) && (index <= hair_styles_list.len))
|
||||
H.h_style = hair_styles_list[index]
|
||||
|
||||
//Facial Hair
|
||||
var/beardnum = hex2num(getblock(structure,12,3))
|
||||
index = round(1 +(beardnum / 4096)*facial_hair_styles_list.len)
|
||||
if((0 < index) && (index <= facial_hair_styles_list.len))
|
||||
H.f_style = facial_hair_styles_list[index]
|
||||
|
||||
H.update_body(0)
|
||||
H.update_hair()
|
||||
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
/proc/probinj(var/pr, var/inj)
|
||||
return prob(pr+inj*pr)
|
||||
|
||||
/proc/domutcheck(mob/living/M as mob, connected, inj)
|
||||
if (!M) return
|
||||
|
||||
M.dna.check_integrity()
|
||||
|
||||
M.disabilities = 0
|
||||
M.sdisabilities = 0
|
||||
var/old_mutations = M.mutations
|
||||
M.mutations = list()
|
||||
M.pass_flags = 0
|
||||
// M.see_in_dark = 2
|
||||
// M.see_invisible = 0
|
||||
|
||||
if(PLANT in old_mutations)
|
||||
M.mutations.Add(PLANT)
|
||||
if(SKELETON in old_mutations)
|
||||
M.mutations.Add(SKELETON)
|
||||
if(FAT in old_mutations)
|
||||
M.mutations.Add(FAT)
|
||||
if(HUSK in old_mutations)
|
||||
M.mutations.Add(HUSK)
|
||||
|
||||
if(ismuton(NOBREATHBLOCK,M))
|
||||
if(probinj(45,inj) || (mNobreath in old_mutations))
|
||||
M << "\blue You feel no need to breathe."
|
||||
M.mutations.Add(mNobreath)
|
||||
if(ismuton(REMOTEVIEWBLOCK,M))
|
||||
if(probinj(45,inj) || (mRemote in old_mutations))
|
||||
M << "\blue Your mind expands"
|
||||
M.mutations.Add(mRemote)
|
||||
M.verbs += /mob/living/carbon/human/proc/remoteobserve
|
||||
if(ismuton(REGENERATEBLOCK,M))
|
||||
if(probinj(45,inj) || (mRegen in old_mutations))
|
||||
M << "\blue Your body pulses with energy"
|
||||
M.mutations.Add(mRegen)
|
||||
if(ismuton(INCREASERUNBLOCK,M))
|
||||
if(probinj(45,inj) || (mRun in old_mutations))
|
||||
M << "\blue You feel quick"
|
||||
M.mutations.Add(mRun)
|
||||
if(ismuton(REMOTETALKBLOCK,M))
|
||||
if(probinj(45,inj) || (mRemotetalk in old_mutations))
|
||||
M << "\blue You expand your mind outwards"
|
||||
M.mutations.Add(mRemotetalk)
|
||||
M.verbs += /mob/living/carbon/human/proc/remotesay
|
||||
if(ismuton(MORPHBLOCK,M))
|
||||
if(probinj(45,inj) || (mMorph in old_mutations))
|
||||
M.mutations.Add(mMorph)
|
||||
M << "\blue Your skin feels strange"
|
||||
M.verbs += /mob/living/carbon/human/proc/morph
|
||||
if(ismuton(BLENDBLOCK,M))
|
||||
if(probinj(45,inj) || (mBlend in old_mutations))
|
||||
M.mutations.Add(mBlend)
|
||||
M << "\blue You feel alone"
|
||||
if(ismuton(HALLUCINATIONBLOCK,M))
|
||||
if(probinj(45,inj) || (mHallucination in old_mutations))
|
||||
M.mutations.Add(mHallucination)
|
||||
M << "\red Your mind says 'Hello'"
|
||||
if(ismuton(NOPRINTSBLOCK,M))
|
||||
if(probinj(45,inj) || (mFingerprints in old_mutations))
|
||||
M.mutations.Add(mFingerprints)
|
||||
M << "\blue Your fingers feel numb"
|
||||
if(ismuton(SHOCKIMMUNITYBLOCK,M))
|
||||
if(probinj(45,inj) || (mShock in old_mutations))
|
||||
M.mutations.Add(mShock)
|
||||
M << "\blue Your skin feels dry"
|
||||
if(ismuton(SMALLSIZEBLOCK,M))
|
||||
if(probinj(45,inj) || (mSmallsize in old_mutations))
|
||||
M << "\blue Your skin feels rubbery"
|
||||
M.mutations.Add(mSmallsize)
|
||||
M.pass_flags |= 1
|
||||
|
||||
|
||||
|
||||
if (isblockon(getblock(M.dna.struc_enzymes, HULKBLOCK,3),HULKBLOCK))
|
||||
if(probinj(5,inj) || (HULK in old_mutations))
|
||||
M << "\blue Your muscles hurt."
|
||||
M.mutations.Add(HULK)
|
||||
if (isblockon(getblock(M.dna.struc_enzymes, HEADACHEBLOCK,3),HEADACHEBLOCK))
|
||||
M.disabilities |= EPILEPSY
|
||||
M << "\red You get a headache."
|
||||
if (isblockon(getblock(M.dna.struc_enzymes, FAKEBLOCK,3),FAKEBLOCK))
|
||||
M << "\red You feel strange."
|
||||
if (prob(95))
|
||||
if(prob(50))
|
||||
randmutb(M)
|
||||
else
|
||||
randmuti(M)
|
||||
else
|
||||
randmutg(M)
|
||||
if (isblockon(getblock(M.dna.struc_enzymes, COUGHBLOCK,3),COUGHBLOCK))
|
||||
M.disabilities |= COUGHING
|
||||
M << "\red You start coughing."
|
||||
if (isblockon(getblock(M.dna.struc_enzymes, CLUMSYBLOCK,3),CLUMSYBLOCK))
|
||||
M << "\red You feel lightheaded."
|
||||
M.mutations.Add(CLUMSY)
|
||||
if (isblockon(getblock(M.dna.struc_enzymes, TWITCHBLOCK,3),TWITCHBLOCK))
|
||||
M.disabilities |= TOURETTES
|
||||
M << "\red You twitch."
|
||||
if (isblockon(getblock(M.dna.struc_enzymes, XRAYBLOCK,3),XRAYBLOCK))
|
||||
if(probinj(30,inj) || (XRAY in old_mutations))
|
||||
M << "\blue The walls suddenly disappear."
|
||||
// M.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS)
|
||||
// M.see_in_dark = 8
|
||||
// M.see_invisible = 2
|
||||
M.mutations.Add(XRAY)
|
||||
if (isblockon(getblock(M.dna.struc_enzymes, NERVOUSBLOCK,3),NERVOUSBLOCK))
|
||||
M.disabilities |= NERVOUS
|
||||
M << "\red You feel nervous."
|
||||
if (isblockon(getblock(M.dna.struc_enzymes, FIREBLOCK,3),FIREBLOCK))
|
||||
if(probinj(30,inj) || (COLD_RESISTANCE in old_mutations))
|
||||
M << "\blue Your body feels warm."
|
||||
M.mutations.Add(COLD_RESISTANCE)
|
||||
if (isblockon(getblock(M.dna.struc_enzymes, BLINDBLOCK,3),BLINDBLOCK))
|
||||
M.sdisabilities |= BLIND
|
||||
M << "\red You can't seem to see anything."
|
||||
if (isblockon(getblock(M.dna.struc_enzymes, TELEBLOCK,3),TELEBLOCK))
|
||||
if(probinj(15,inj) || (TK in old_mutations))
|
||||
M << "\blue You feel smarter."
|
||||
M.mutations.Add(TK)
|
||||
if (isblockon(getblock(M.dna.struc_enzymes, DEAFBLOCK,3),DEAFBLOCK))
|
||||
M.sdisabilities |= DEAF
|
||||
M.ear_deaf = 1
|
||||
M << "\red Its kinda quiet.."
|
||||
if (isblockon(getblock(M.dna.struc_enzymes, GLASSESBLOCK,3),GLASSESBLOCK))
|
||||
M.disabilities |= NEARSIGHTED
|
||||
M << "Your eyes feel weird..."
|
||||
|
||||
/* If you want the new mutations to work, UNCOMMENT THIS.
|
||||
if(istype(M, /mob/living/carbon))
|
||||
for (var/datum/mutations/mut in global_mutations)
|
||||
mut.check_mutation(M)
|
||||
*/
|
||||
|
||||
//////////////////////////////////////////////////////////// Monkey Block
|
||||
if (isblockon(getblock(M.dna.struc_enzymes, MONKEYBLOCK,3),MONKEYBLOCK) && istype(M, /mob/living/carbon/human))
|
||||
// human > monkey
|
||||
var/mob/living/carbon/human/H = M
|
||||
H.notransform = 1
|
||||
var/list/implants = list() //Try to preserve implants.
|
||||
for(var/obj/item/weapon/implant/W in H)
|
||||
implants += W
|
||||
W.loc = null
|
||||
|
||||
if(!connected)
|
||||
for(var/obj/item/W in (H.contents-implants))
|
||||
if (W==H.w_uniform) // will be teared
|
||||
continue
|
||||
H.unEquip(W)
|
||||
M.notransform = 1
|
||||
M.canmove = 0
|
||||
M.icon = null
|
||||
M.invisibility = 101
|
||||
var/atom/movable/overlay/animation = new( M.loc )
|
||||
animation.icon_state = "blank"
|
||||
animation.icon = 'icons/mob/mob.dmi'
|
||||
animation.master = src
|
||||
flick("h2monkey", animation)
|
||||
sleep(48)
|
||||
del(animation)
|
||||
|
||||
|
||||
var/mob/living/carbon/monkey/O = null
|
||||
if(H.species.primitive)
|
||||
O = new H.species.primitive(src)
|
||||
else
|
||||
H.gib() //Trying to change the species of a creature with no primitive var set is messy.
|
||||
return
|
||||
|
||||
if(M)
|
||||
if (M.dna)
|
||||
O.dna = M.dna
|
||||
M.dna = null
|
||||
|
||||
if (M.suiciding)
|
||||
O.suiciding = M.suiciding
|
||||
M.suiciding = null
|
||||
|
||||
|
||||
for(var/datum/disease/D in M.viruses)
|
||||
O.viruses += D
|
||||
D.affected_mob = O
|
||||
M.viruses -= D
|
||||
|
||||
|
||||
for(var/obj/T in (M.contents-implants))
|
||||
del(T)
|
||||
|
||||
O.loc = M.loc
|
||||
|
||||
if(M.mind)
|
||||
M.mind.transfer_to(O) //transfer our mind to the cute little monkey
|
||||
|
||||
if (connected) //inside dna thing
|
||||
var/obj/machinery/dna_scannernew/C = connected
|
||||
O.loc = C
|
||||
C.occupant = O
|
||||
connected = null
|
||||
O.real_name = text("monkey ([])",copytext(md5(M.real_name), 2, 6))
|
||||
O.take_overall_damage(M.getBruteLoss() + 40, M.getFireLoss())
|
||||
O.adjustToxLoss(M.getToxLoss() + 20)
|
||||
O.adjustOxyLoss(M.getOxyLoss())
|
||||
O.stat = M.stat
|
||||
O.a_intent = I_HARM
|
||||
for (var/obj/item/weapon/implant/I in implants)
|
||||
I.loc = O
|
||||
I.implanted = O
|
||||
// O.update_icon = 1 //queue a full icon update at next life() call
|
||||
del(M)
|
||||
return
|
||||
|
||||
if (!isblockon(getblock(M.dna.struc_enzymes, MONKEYBLOCK,3),MONKEYBLOCK) && !istype(M, /mob/living/carbon/human))
|
||||
// monkey > human,
|
||||
var/mob/living/carbon/monkey/Mo = M
|
||||
Mo.notransform = 1
|
||||
var/list/implants = list() //Still preserving implants
|
||||
for(var/obj/item/weapon/implant/W in Mo)
|
||||
implants += W
|
||||
W.loc = null
|
||||
if(!connected)
|
||||
for(var/obj/item/W in (Mo.contents-implants))
|
||||
Mo.unEquip(W)
|
||||
M.notransform = 1
|
||||
M.canmove = 0
|
||||
M.icon = null
|
||||
M.invisibility = 101
|
||||
var/atom/movable/overlay/animation = new( M.loc )
|
||||
animation.icon_state = "blank"
|
||||
animation.icon = 'icons/mob/mob.dmi'
|
||||
animation.master = src
|
||||
flick("monkey2h", animation)
|
||||
sleep(48)
|
||||
del(animation)
|
||||
|
||||
var/mob/living/carbon/human/human/O = new( src )
|
||||
if(Mo.greaterform)
|
||||
O.set_species(Mo.greaterform)
|
||||
|
||||
if (isblockon(getblock(M.dna.uni_identity, 11,3),11))
|
||||
O.gender = FEMALE
|
||||
else
|
||||
O.gender = MALE
|
||||
|
||||
if (M)
|
||||
if (M.dna)
|
||||
O.dna = M.dna
|
||||
M.dna = null
|
||||
|
||||
if (M.suiciding)
|
||||
O.suiciding = M.suiciding
|
||||
M.suiciding = null
|
||||
|
||||
for(var/datum/disease/D in M.viruses)
|
||||
O.viruses += D
|
||||
D.affected_mob = O
|
||||
M.viruses -= D
|
||||
|
||||
//for(var/obj/T in M)
|
||||
// del(T)
|
||||
|
||||
O.loc = M.loc
|
||||
|
||||
if(M.mind)
|
||||
M.mind.transfer_to(O) //transfer our mind to the human
|
||||
|
||||
if (connected) //inside dna thing
|
||||
var/obj/machinery/dna_scannernew/C = connected
|
||||
O.loc = C
|
||||
C.occupant = O
|
||||
connected = null
|
||||
|
||||
var/i
|
||||
while (!i)
|
||||
var/randomname
|
||||
if (O.gender == MALE)
|
||||
randomname = capitalize(pick(first_names_male) + " " + capitalize(pick(last_names)))
|
||||
else
|
||||
randomname = capitalize(pick(first_names_female) + " " + capitalize(pick(last_names)))
|
||||
if (findname(randomname))
|
||||
continue
|
||||
else
|
||||
O.real_name = randomname
|
||||
i++
|
||||
updateappearance(O,O.dna.uni_identity)
|
||||
O.take_overall_damage(M.getBruteLoss(), M.getFireLoss())
|
||||
O.adjustToxLoss(M.getToxLoss())
|
||||
O.adjustOxyLoss(M.getOxyLoss())
|
||||
O.stat = M.stat
|
||||
for (var/obj/item/weapon/implant/I in implants)
|
||||
I.loc = O
|
||||
I.implanted = O
|
||||
// O.update_icon = 1 //queue a full icon update at next life() call
|
||||
del(M)
|
||||
return
|
||||
//////////////////////////////////////////////////////////// Monkey Block
|
||||
if(M)
|
||||
M.update_icon = 1 //queue a full icon update at next life() call
|
||||
return null
|
||||
|
||||
|
||||
/proc/togglemut(mob/M as mob, var/block)
|
||||
if(!M) return
|
||||
var/newdna
|
||||
M.dna.check_integrity()
|
||||
newdna = setblock(M.dna.struc_enzymes,block,toggledblock(getblock(M.dna.struc_enzymes,block,3)),3)
|
||||
M.dna.struc_enzymes = newdna
|
||||
return
|
||||
|
||||
/////////////////////////// DNA MISC-PROCS
|
||||
@@ -5,31 +5,34 @@
|
||||
block=MONKEYBLOCK
|
||||
|
||||
/datum/dna/gene/monkey/can_activate(var/mob/M,var/flags)
|
||||
return istype(M, /mob/living/carbon/human)
|
||||
return ishuman(M)
|
||||
|
||||
/datum/dna/gene/monkey/activate(var/mob/living/carbon/human/H, var/connected, var/flags)
|
||||
if(!istype(H,/mob/living/carbon/human))
|
||||
// testing("Cannot monkey-ify [M], type is [M.type].")
|
||||
return
|
||||
if(issmall(H)) // Already a monkey
|
||||
if(issmall(H))
|
||||
return
|
||||
for(var/obj/item/W in H)
|
||||
if(istype(W,/obj/item/organ))
|
||||
continue
|
||||
if(istype(W,/obj/item/weapon/implant))
|
||||
continue
|
||||
H.unEquip(W)
|
||||
|
||||
H.regenerate_icons()
|
||||
H.canmove = 0
|
||||
H.stunned = 1
|
||||
H.icon = null
|
||||
H.invisibility = 101
|
||||
var/atom/movable/overlay/animation = new /atom/movable/overlay( H.loc )
|
||||
|
||||
var/atom/movable/overlay/animation = new /atom/movable/overlay(H.loc)
|
||||
animation.icon_state = "blank"
|
||||
animation.icon = 'icons/mob/mob.dmi'
|
||||
animation.master = H
|
||||
flick("h2monkey", animation)
|
||||
sleep(48)
|
||||
//animation = null
|
||||
|
||||
sleep(22)
|
||||
qdel(animation)
|
||||
|
||||
H.stunned = 0
|
||||
H.update_canmove()
|
||||
H.invisibility = initial(H.invisibility)
|
||||
@@ -43,33 +46,34 @@
|
||||
if(H.hud_used)
|
||||
H.hud_used.instantiate()
|
||||
|
||||
H << "<B>You are now a [H.species.name]. </B>"
|
||||
qdel(animation)
|
||||
H << "<B>You are now a [H.species.name].</B>"
|
||||
|
||||
return H
|
||||
|
||||
/datum/dna/gene/monkey/deactivate(var/mob/living/carbon/human/H, var/connected, var/flags)
|
||||
if(!istype(H,/mob/living/carbon/human))
|
||||
// testing("Cannot monkey-ify [M], type is [M.type].")
|
||||
return
|
||||
for(var/obj/item/W in H)
|
||||
if (W==H.w_uniform) // will be torn
|
||||
if (W == H.w_uniform) // will be torn
|
||||
continue
|
||||
if(istype(W,/obj/item/organ))
|
||||
continue
|
||||
if(istype(W,/obj/item/weapon/implant))
|
||||
continue
|
||||
H.unEquip(W)
|
||||
H.regenerate_icons()
|
||||
H.canmove = 0
|
||||
H.stunned = 1
|
||||
H.icon = null
|
||||
H.invisibility = 101
|
||||
var/atom/movable/overlay/animation = new /atom/movable/overlay( H.loc )
|
||||
|
||||
var/atom/movable/overlay/animation = new /atom/movable/overlay(H.loc)
|
||||
animation.icon_state = "blank"
|
||||
animation.icon = 'icons/mob/mob.dmi'
|
||||
animation.master = H
|
||||
flick("monkey2h", animation)
|
||||
sleep(48)
|
||||
//animation = null
|
||||
sleep(22)
|
||||
qdel(animation)
|
||||
|
||||
H.stunned = 0
|
||||
H.update_canmove()
|
||||
@@ -84,7 +88,6 @@
|
||||
if(H.hud_used)
|
||||
H.hud_used.instantiate()
|
||||
|
||||
H << "<B>You are now a [H.species.name]. </B>"
|
||||
qdel(animation)
|
||||
H << "<B>You are now a [H.species.name].</B>"
|
||||
|
||||
return H
|
||||
@@ -124,7 +124,6 @@
|
||||
icon_state = "arm_blade"
|
||||
item_state = "arm_blade"
|
||||
flags = ABSTRACT | NODROP
|
||||
icon_override = 'icons/mob/in-hand/changeling.dmi'
|
||||
w_class = 5.0
|
||||
sharp = 1
|
||||
edge = 1
|
||||
@@ -206,7 +205,6 @@
|
||||
flags = NODROP
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "ling_shield"
|
||||
icon_override = 'icons/mob/in-hand/changeling.dmi'
|
||||
|
||||
var/remaining_uses //Set by the changeling ability.
|
||||
|
||||
|
||||
@@ -77,6 +77,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
|
||||
|
||||
H.underwear = "None"
|
||||
H.undershirt = "None"
|
||||
H.socks = "None"
|
||||
H.faction |= "faithless"
|
||||
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(usr), slot_w_uniform)
|
||||
|
||||
@@ -39,7 +39,6 @@
|
||||
on_use_sound = "sound/magic/Disintegrate.ogg"
|
||||
icon_state = "disintegrate"
|
||||
item_state = "disintegrate"
|
||||
icon_override = 'icons/mob/in-hand/spells.dmi'
|
||||
|
||||
/obj/item/weapon/melee/touch_attack/disintegrate/afterattack(atom/target, mob/living/carbon/user, proximity)
|
||||
if(!proximity || target == user || !ismob(target) || !iscarbon(user) || user.lying || user.handcuffed) //exploding after touching yourself would be bad
|
||||
@@ -64,7 +63,6 @@
|
||||
on_use_sound = "sound/magic/FleshToStone.ogg"
|
||||
icon_state = "fleshtostone"
|
||||
item_state = "fleshtostone"
|
||||
icon_override = 'icons/mob/in-hand/spells.dmi'
|
||||
|
||||
/obj/item/weapon/melee/touch_attack/fleshtostone/afterattack(atom/target, mob/living/carbon/user, proximity)
|
||||
if(!proximity || target == user || !ismob(target) || !iscarbon(user) || user.lying || user.handcuffed) //getting hard after touching yourself would also be bad
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
|
||||
/mob/proc/rightandwrong(var/summon_type) //0 = Summon Guns, 1 = Summon Magic
|
||||
var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","silenced","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction")
|
||||
var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","silenced","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg")
|
||||
var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffhealing", "armor", "scrying", "staffdoor", "special")
|
||||
var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos")
|
||||
usr << "<B>You summoned [summon_type ? "magic" : "guns"]!</B>"
|
||||
@@ -30,7 +30,7 @@
|
||||
if("nuclear")
|
||||
new /obj/item/weapon/gun/energy/gun/nuclear(get_turf(H))
|
||||
if("deagle")
|
||||
new /obj/item/weapon/gun/projectile/automatic/deagle/camo(get_turf(H))
|
||||
new /obj/item/weapon/gun/projectile/automatic/pistol/deagle/camo(get_turf(H))
|
||||
if("gyrojet")
|
||||
new /obj/item/weapon/gun/projectile/automatic/gyropistol(get_turf(H))
|
||||
if("pulse")
|
||||
@@ -47,17 +47,19 @@
|
||||
if("combatshotgun")
|
||||
new /obj/item/weapon/gun/projectile/shotgun/combat(get_turf(H))
|
||||
if("bulldog")
|
||||
new /obj/item/weapon/gun/projectile/automatic/bulldog(get_turf(H))
|
||||
new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(get_turf(H))
|
||||
if("arg")
|
||||
new /obj/item/weapon/gun/projectile/automatic/ar(get_turf(H))
|
||||
if("mateba")
|
||||
new /obj/item/weapon/gun/projectile/revolver/mateba(get_turf(H))
|
||||
if("sabr")
|
||||
new /obj/item/weapon/gun/projectile/automatic(get_turf(H))
|
||||
new /obj/item/weapon/gun/projectile/automatic/proto(get_turf(H))
|
||||
if("crossbow")
|
||||
new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow(get_turf(H))
|
||||
if("saw")
|
||||
new /obj/item/weapon/gun/projectile/automatic/l6_saw(get_turf(H))
|
||||
if("car")
|
||||
new /obj/item/weapon/gun/projectile/automatic/c90gl(get_turf(H))
|
||||
new /obj/item/weapon/gun/projectile/automatic/m90(get_turf(H))
|
||||
if("boltaction")
|
||||
new /obj/item/weapon/gun/projectile/shotgun/boltaction(get_turf(H))
|
||||
else
|
||||
|
||||
@@ -42,6 +42,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
|
||||
var/obj/item/organ/external/affected = H.organs_by_name["head"]
|
||||
affected.implants += L
|
||||
L.part = affected
|
||||
callHook("captain_spawned", list("captain" = H))
|
||||
return 1
|
||||
|
||||
get_access()
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -11,9 +11,15 @@
|
||||
var/processing = 0
|
||||
var/icon_keyboard = "generic_key"
|
||||
var/icon_screen = "generic"
|
||||
var/light_range_on = 2
|
||||
var/light_power_on = 1
|
||||
var/light_range_on = 3
|
||||
var/light_power_on = 2
|
||||
var/overlay_layer
|
||||
atom_say_verb = "beeps"
|
||||
|
||||
/obj/machinery/computer/New()
|
||||
overlay_layer = layer
|
||||
..()
|
||||
|
||||
/obj/machinery/computer/initialize()
|
||||
power_change()
|
||||
update_icon()
|
||||
@@ -64,18 +70,18 @@
|
||||
|
||||
/obj/machinery/computer/update_icon()
|
||||
overlays.Cut()
|
||||
|
||||
var/overlay_layer = LIGHTING_LAYER+0.1
|
||||
|
||||
if(stat & NOPOWER)
|
||||
if(icon_keyboard)
|
||||
overlays += image(icon,"[icon_keyboard]_off",overlay_layer)
|
||||
return
|
||||
overlays += image(icon, icon_keyboard ,overlay_layer)
|
||||
|
||||
if(stat & BROKEN)
|
||||
overlays += image(icon,"[icon_state]_broken",overlay_layer)
|
||||
else
|
||||
overlays += image(icon,icon_screen,overlay_layer)
|
||||
|
||||
if(icon_keyboard)
|
||||
overlays += image(icon, icon_keyboard ,overlay_layer)
|
||||
|
||||
|
||||
/obj/machinery/computer/power_change()
|
||||
@@ -86,7 +92,6 @@
|
||||
else
|
||||
set_light(light_range_on, light_power_on)
|
||||
|
||||
|
||||
/obj/machinery/computer/proc/set_broken()
|
||||
stat |= BROKEN
|
||||
update_icon()
|
||||
|
||||
@@ -238,6 +238,7 @@ FIRE ALARM
|
||||
if (!( src.working ))
|
||||
return
|
||||
var/area/A = get_area(src)
|
||||
A.fire_reset()
|
||||
for(var/obj/machinery/firealarm/FA in A)
|
||||
fire_alarm.clearAlarm(loc, FA)
|
||||
return
|
||||
|
||||
@@ -381,7 +381,7 @@ Class Procs:
|
||||
for(var/obj/item/I in component_parts)
|
||||
if(I.reliability != 100 && crit_fail)
|
||||
I.crit_fail = 1
|
||||
I.loc = src.loc
|
||||
I.forceMove(loc)
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/proc/default_deconstruction_screwdriver(var/mob/user, var/icon_state_open, var/icon_state_closed, var/obj/item/weapon/screwdriver/S)
|
||||
|
||||
@@ -842,6 +842,22 @@
|
||||
/obj/item/weapon/cartridge/atmos = 75,/obj/item/weapon/cartridge/janitor = 100,/obj/item/weapon/cartridge/signal/toxins = 150,
|
||||
/obj/item/weapon/cartridge/signal = 75,/obj/item/weapon/cartridge = 50)
|
||||
|
||||
|
||||
/obj/machinery/vending/liberationstation
|
||||
name = "\improper Liberation Station"
|
||||
desc = "An overwhelming amount of <b>ancient patriotism</b> washes over you just by looking at the machine."
|
||||
icon_state = "liberationstation"
|
||||
req_access_txt = "1"
|
||||
product_slogans = "Liberation Station: Your one-stop shop for all things second amendment!;Be a patriot today, pick up a gun!;Quality weapons for cheap prices!;Better dead than red!"
|
||||
product_ads = "Float like an astronaut, sting like a bullet!;Express your second amendment today!;Guns don't kill people, but you can!;Who needs responsibilities when you have guns?"
|
||||
vend_reply = "Remember the name: Liberation Station!"
|
||||
products = list(/obj/item/weapon/gun/projectile/automatic/pistol/deagle/gold = 2,/obj/item/weapon/gun/projectile/automatic/pistol/deagle/camo = 2,
|
||||
/obj/item/weapon/gun/projectile/automatic/pistol/m2411 = 2,/obj/item/weapon/gun/projectile/automatic/proto = 2,
|
||||
/obj/item/weapon/gun/projectile/shotgun/combat = 2,/obj/item/weapon/gun/projectile/automatic/gyropistol = 1,
|
||||
/obj/item/weapon/gun/projectile/shotgun = 2,/obj/item/weapon/gun/projectile/automatic/ar = 2)
|
||||
premium = list(/obj/item/ammo_box/magazine/smgm9mm = 2,/obj/item/ammo_box/magazine/m50 = 4,/obj/item/ammo_box/magazine/m45 = 2,/obj/item/ammo_box/magazine/m75 = 2)
|
||||
contraband = list(/obj/item/clothing/under/patriotsuit = 1,/obj/item/weapon/bedsheet/patriot = 3)
|
||||
|
||||
/obj/machinery/vending/cigarette
|
||||
name = "Cigarette machine" //OCD had to be uppercase to look nice with the new formating
|
||||
desc = "If you want to get cancer, might as well do it in style"
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
name = "H.O.N.K"
|
||||
icon_state = "honker"
|
||||
initial_icon = "honker"
|
||||
step_in = 2
|
||||
step_in = 3
|
||||
health = 140
|
||||
deflect_chance = 60
|
||||
internal_damage_threshold = 60
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
name = "Odysseus"
|
||||
icon_state = "odysseus"
|
||||
initial_icon = "odysseus"
|
||||
step_in = 2
|
||||
step_in = 3
|
||||
max_temperature = 15000
|
||||
health = 120
|
||||
wreckage = /obj/effect/decal/mecha_wreckage/odysseus
|
||||
|
||||
@@ -8,7 +8,8 @@
|
||||
health = 200
|
||||
lights_power = 7
|
||||
deflect_chance = 15
|
||||
damage_absorption = list("brute"=0.6,"bomb"=0.2)
|
||||
damage_absorption = list("brute"=0.6,"fire"=1,"bullet"=0.8,"laser"=0.9,"energy"=1,"bomb"=0.6)
|
||||
max_equip = 6
|
||||
wreckage = /obj/effect/decal/mecha_wreckage/ripley
|
||||
var/list/cargo = new
|
||||
var/cargo_capacity = 15
|
||||
@@ -64,7 +65,8 @@
|
||||
max_temperature = 65000
|
||||
health = 250
|
||||
lights_power = 7
|
||||
damage_absorption = list("fire"=0.5,"bullet"=0.8,"bomb"=0.5)
|
||||
damage_absorption = list("brute"=0.6,"fire"=0.5,"bullet"=0.7,"laser"=0.7,"energy"=1,"bomb"=0.4)
|
||||
max_equip = 5 // More armor, less tools
|
||||
wreckage = /obj/effect/decal/mecha_wreckage/ripley/firefighter
|
||||
|
||||
/obj/mecha/working/ripley/deathripley
|
||||
@@ -73,7 +75,10 @@
|
||||
icon_state = "deathripley"
|
||||
step_in = 2
|
||||
opacity=0
|
||||
max_temperature = 65000
|
||||
health = 300
|
||||
lights_power = 7
|
||||
damage_absorption = list("brute"=0.6,"fire"=0.4,"bullet"=0.6,"laser"=0.6,"energy"=1,"bomb"=0.3)
|
||||
wreckage = /obj/effect/decal/mecha_wreckage/ripley/deathripley
|
||||
step_energy_drain = 0
|
||||
|
||||
@@ -97,12 +102,23 @@
|
||||
var/obj/item/mecha_parts/mecha_equipment/tool/drill/D = new /obj/item/mecha_parts/mecha_equipment/tool/drill
|
||||
D.attach(src)
|
||||
|
||||
//Add possible plasma cutter
|
||||
if(prob(25))
|
||||
var/obj/item/mecha_parts/mecha_equipment/M = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma
|
||||
M.attach(src)
|
||||
|
||||
//Add ore box to cargo
|
||||
cargo.Add(new /obj/structure/ore_box(src))
|
||||
|
||||
//Attach hydrolic clamp
|
||||
var/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp/HC = new /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp
|
||||
HC.attach(src)
|
||||
for(var/obj/item/mecha_parts/mecha_tracking/B in src.contents)//Deletes the beacon so it can't be found easily
|
||||
qdel(B)
|
||||
|
||||
var/obj/item/mecha_parts/mecha_equipment/tool/mining_scanner/scanner = new /obj/item/mecha_parts/mecha_equipment/tool/mining_scanner
|
||||
scanner.attach(src)
|
||||
|
||||
/obj/mecha/working/ripley/Exit(atom/movable/O)
|
||||
if(O in cargo)
|
||||
return 0
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
/obj/item/weapon/gun/projectile/automatic/pistol = 8,
|
||||
/obj/item/weapon/gun/projectile/shotgun/combat = 5,
|
||||
/obj/item/weapon/gun/projectile/revolver/mateba,
|
||||
/obj/item/weapon/gun/projectile/automatic/deagle
|
||||
/obj/item/weapon/gun/projectile/automatic/pistol/deagle
|
||||
)
|
||||
|
||||
/obj/effect/spawner/lootdrop/maintenance
|
||||
|
||||
@@ -6,6 +6,14 @@
|
||||
var/image/blood_overlay = null //this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite
|
||||
var/blood_overlay_color = null
|
||||
var/item_state = null
|
||||
var/lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
|
||||
var/righthand_file = 'icons/mob/inhands/items_righthand.dmi'
|
||||
|
||||
//Dimensions of the lefthand_file and righthand_file vars
|
||||
//eg: 32x32 sprite, 64x64 sprite, etc.
|
||||
var/inhand_x_dimension = 32
|
||||
var/inhand_y_dimension = 32
|
||||
|
||||
var/r_speed = 1.0
|
||||
var/health = null
|
||||
var/hitsound = null
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
icon_state = "camera_bug"
|
||||
w_class = 1.0
|
||||
item_state = "camera_bug"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
throw_speed = 4
|
||||
throw_range = 20
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
desc = "A powerful and versatile flashbulb device, with applications ranging from disorienting attackers to acting as visual receptors in robot production."
|
||||
icon_state = "flash"
|
||||
item_state = "flashtool" //looks exactly like a flash (and nothing like a flashbang)
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
throwforce = 0
|
||||
w_class = 1
|
||||
throw_speed = 3
|
||||
|
||||
@@ -95,7 +95,6 @@
|
||||
desc = "A robust flashlight used by security."
|
||||
icon_state = "seclite"
|
||||
item_state = "seclite"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
force = 9 // Not as good as a stun baton.
|
||||
brightness_on = 5 // A little better than the standard flashlight.
|
||||
hitsound = 'sound/weapons/genhit1.ogg'
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
icon = 'icons/obj/musician.dmi'
|
||||
icon_state = "guitar"
|
||||
item_state = "guitar"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
force = 10
|
||||
var/datum/song/handheld/song
|
||||
hitsound = 'sound/effects/guitarsmash.ogg'
|
||||
|
||||
@@ -113,7 +113,6 @@ REAGENT SCANNER
|
||||
name = "Health Analyzer"
|
||||
icon_state = "health"
|
||||
item_state = "healthanalyzer"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
desc = "A hand-held body scanner able to distinguish vital signs of the subject."
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
|
||||
@@ -76,7 +76,6 @@ effective or pretty fucking useless.
|
||||
name = "Health Analyzer"
|
||||
icon_state = "health2"
|
||||
item_state = "healthanalyzer"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
desc = "A hand-held body scanner able to distinguish vital signs of the subject. A strange microlaser is hooked on to the scanning end."
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
desc = "Used by obese officers to save their breath for running."
|
||||
icon_state = "voice0"
|
||||
item_state = "flashtool" //looks exactly like a flash (and nothing like a flashbang)
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
w_class = 1.0
|
||||
flags = CONDUCT
|
||||
|
||||
|
||||
@@ -131,6 +131,8 @@
|
||||
icon = 'icons/obj/gun.dmi'
|
||||
icon_state = "revolver"
|
||||
item_state = "gun"
|
||||
lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/guns_righthand.dmi'
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
w_class = 3.0
|
||||
@@ -204,6 +206,8 @@
|
||||
icon = 'icons/obj/gun.dmi'
|
||||
icon_state = "crossbow"
|
||||
item_state = "crossbow"
|
||||
lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/guns_righthand.dmi'
|
||||
w_class = 2.0
|
||||
attack_verb = list("attacked", "struck", "hit")
|
||||
var/bullets = 5
|
||||
@@ -1096,7 +1100,6 @@ obj/item/toy/cards/deck/syndicate/black
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "foamblade"
|
||||
item_state = "arm_blade"
|
||||
icon_override = 'icons/mob/in-hand/changeling.dmi'
|
||||
attack_verb = list("pricked", "absorbed", "gored")
|
||||
w_class = 2
|
||||
|
||||
@@ -1109,7 +1112,6 @@ obj/item/toy/cards/deck/syndicate/black
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "flash"
|
||||
item_state = "flashtool"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
w_class = 1
|
||||
|
||||
/obj/item/toy/flash/attack(mob/living/M, mob/user)
|
||||
|
||||
@@ -41,7 +41,6 @@
|
||||
icon = 'icons/obj/chronos.dmi'
|
||||
icon_state = "chronogun"
|
||||
item_state = "chronogun"
|
||||
icon_override = 'icons/mob/in-hand/guns.dmi'
|
||||
w_class = 3.0
|
||||
projectile_type = "/obj/item/projectile/energy/chrono_beam"
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "defibunit"
|
||||
item_state = "defibunit"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
slot_flags = SLOT_BACK
|
||||
force = 5
|
||||
throwforce = 6
|
||||
@@ -249,7 +248,6 @@
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "defibpaddles"
|
||||
item_state = "defibpaddles"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
force = 0
|
||||
throwforce = 6
|
||||
w_class = 4
|
||||
|
||||
@@ -8,7 +8,6 @@ var/turf/T
|
||||
icon = 'icons/obj/grenade.dmi'
|
||||
icon_state = "banana"
|
||||
item_state = "flashbang"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
var/deliveryamt = 8
|
||||
var/spawner_type = /obj/item/weapon/bananapeel
|
||||
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
desc = "A do it yourself grenade casing!"
|
||||
icon_state = "chemg"
|
||||
item_state = "flashbang"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
var/bomb_state = "chembomb"
|
||||
var/payload_name = null // used for spawned grenades
|
||||
w_class = 2
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
desc = "HONK! brand Bananas. In a special applicator for rapid slipping of wide areas."
|
||||
icon_state = "banana"
|
||||
item_state = "flashbang"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
w_class = 2.0
|
||||
force = 2.0
|
||||
var/stage = 0
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
name = "classic emp grenade"
|
||||
icon_state = "emp"
|
||||
item_state = "emp"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
origin_tech = "materials=2;magnets=3"
|
||||
|
||||
prime()
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
name = "flashbang"
|
||||
icon_state = "flashbang"
|
||||
item_state = "flashbang"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
origin_tech = "materials=2;combat=1"
|
||||
var/banglet = 0
|
||||
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
icon = 'icons/obj/grenade.dmi'
|
||||
icon_state = "improvised_grenade"
|
||||
item_state = "flashbang"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
throw_speed = 3
|
||||
throw_range = 7
|
||||
flags = CONDUCT
|
||||
@@ -72,7 +71,6 @@
|
||||
icon = 'icons/obj/grenade.dmi'
|
||||
icon_state = "improvised_grenade"
|
||||
item_state = "flashbang"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
throw_speed = 3
|
||||
throw_range = 7
|
||||
flags = CONDUCT
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
icon = 'icons/obj/grenade.dmi'
|
||||
icon_state = "grenade"
|
||||
item_state = "flashbang"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
throw_speed = 4
|
||||
throw_range = 20
|
||||
flags = CONDUCT
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
icon_state = "flashbang"
|
||||
det_time = 20
|
||||
item_state = "flashbang"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
slot_flags = SLOT_BELT
|
||||
var/datum/effect/effect/system/bad_smoke_spread/smoke
|
||||
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
icon = 'icons/obj/grenade.dmi'
|
||||
icon_state = "delivery"
|
||||
item_state = "flashbang"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
origin_tech = "materials=3;magnets=4"
|
||||
var/banglet = 0
|
||||
var/spawner_type = null // must be an object path
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
icon = 'icons/obj/grenade.dmi'
|
||||
icon_state = "syndicate"
|
||||
item_state = "flashbang"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
origin_tech = "materials=3;magnets=4;syndicate=4"
|
||||
|
||||
/obj/item/weapon/grenade/syndieminibomb/prime()
|
||||
|
||||
@@ -110,7 +110,6 @@
|
||||
desc = "An entangling bolas. Throw at your foes to trip them and prevent them from running."
|
||||
gender = NEUTER
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_override = 'icons/mob/in-hand/swords.dmi'
|
||||
icon_state = "bolas"
|
||||
siemens_coefficient = 1
|
||||
slot_flags = SLOT_BELT
|
||||
|
||||
@@ -36,7 +36,6 @@
|
||||
name = "energy sword"
|
||||
desc = "May the force be within you."
|
||||
icon_state = "sword0"
|
||||
icon_override = 'icons/mob/in-hand/swords.dmi'
|
||||
force = 3.0
|
||||
throwforce = 5.0
|
||||
throw_speed = 1
|
||||
|
||||
@@ -155,3 +155,9 @@
|
||||
|
||||
/obj/item/weapon/stock_parts/cell/emproof/corrupt()
|
||||
return
|
||||
|
||||
/obj/item/weapon/stock_parts/cell/temperaturegun
|
||||
name = "temperature gun cell"
|
||||
desc = "A specially designed power cell for heating and cooling projectiles"
|
||||
icon_state = "icell"
|
||||
maxcharge = 900
|
||||
@@ -88,7 +88,6 @@
|
||||
desc = "An advanced riot shield made of lightweight materials that collapses for easy storage."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "teleriot0"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
slot_flags = null
|
||||
force = 3
|
||||
throwforce = 3
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
/obj/item/weapon/picket_sign
|
||||
icon_state = "picket"
|
||||
item_state = "picket"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
name = "blank picket sign"
|
||||
desc = "It's blank"
|
||||
force = 5
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "broom"
|
||||
item_state = "broom0"
|
||||
icon_override = 'icons/mob/in-hand/staff.dmi'
|
||||
|
||||
/obj/item/weapon/twohanded/staff/broom/attack_self(mob/user as mob)
|
||||
..()
|
||||
@@ -58,7 +57,6 @@
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "horsebroom"
|
||||
item_state = "horsebroom0"
|
||||
icon_override = 'icons/mob/in-hand/staff.dmi'
|
||||
|
||||
/obj/item/weapon/twohanded/staff/broom/horsebroom/attack_self(mob/user as mob)
|
||||
..()
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
desc = "Special mechanical module made to store, sort, and apply standard machine parts."
|
||||
icon_state = "RPED"
|
||||
item_state = "RPED"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
w_class = 5
|
||||
can_hold = list("/obj/item/weapon/stock_parts")
|
||||
storage_slots = 50
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
slot_flags = SLOT_BACK //ERROOOOO
|
||||
max_w_class = 3
|
||||
max_combined_w_class = 21
|
||||
storage_slots = 21
|
||||
|
||||
/obj/item/weapon/storage/backpack/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
|
||||
playsound(src.loc, "rustle", 50, 1, -5)
|
||||
@@ -73,7 +74,6 @@
|
||||
icon_state = "giftbag0"
|
||||
item_state = "giftbag"
|
||||
w_class = 4.0
|
||||
storage_slots = 20
|
||||
max_w_class = 3
|
||||
max_combined_w_class = 400 // can store a ton of shit!
|
||||
|
||||
@@ -197,7 +197,6 @@
|
||||
desc = "A very slim satchel that can easily fit into tight spaces."
|
||||
icon_state = "satchel-flat"
|
||||
w_class = 3 //Can fit in backpacks itself.
|
||||
storage_slots = 5
|
||||
max_combined_w_class = 15
|
||||
level = 1
|
||||
cant_hold = list(/obj/item/weapon/storage/backpack/satchel_flat) //muh recursive backpacks
|
||||
@@ -224,11 +223,9 @@
|
||||
/obj/item/weapon/storage/backpack/duffel
|
||||
name = "duffelbag"
|
||||
desc = "A large grey duffelbag designed to hold more items than a regular bag."
|
||||
icon_override = 'icons/mob/in-hand/duffelbag.dmi'
|
||||
icon_state = "duffel"
|
||||
item_state = "duffel"
|
||||
storage_slots = 9 // Duffelbags can hold more items.
|
||||
max_combined_w_class = 27
|
||||
max_combined_w_class = 30
|
||||
slowdown = 1
|
||||
|
||||
/obj/item/weapon/storage/backpack/duffel/syndie
|
||||
@@ -272,7 +269,6 @@
|
||||
desc = "A suspicious looking dufflebag for holding surgery tools."
|
||||
icon_state = "duffel-syndimed"
|
||||
item_state = "duffle-syndimed"
|
||||
storage_slots = 12
|
||||
|
||||
/obj/item/weapon/storage/backpack/duffel/syndie/surgery/New()
|
||||
..()
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
name = "first-aid kit"
|
||||
desc = "It's an emergency medical kit for those serious boo-boos."
|
||||
icon_state = "firstaid"
|
||||
icon_override = 'icons/mob/in-hand/medkits.dmi'
|
||||
throw_speed = 2
|
||||
throw_range = 8
|
||||
var/empty = 0
|
||||
|
||||
@@ -235,7 +235,7 @@
|
||||
return 0 //Means the item is already in the storage item
|
||||
if(contents.len >= storage_slots)
|
||||
if(!stop_messages)
|
||||
usr << "<span class='notice'>[src] is full, make some space.</span>"
|
||||
usr << "<span class='warning'>[W] won't fit in [src], make some space!</span>"
|
||||
return 0 //Storage item is full
|
||||
|
||||
if(can_hold.len)
|
||||
|
||||
@@ -200,7 +200,6 @@
|
||||
desc = "A high-tech nitrogen tank designed specifically for Vox."
|
||||
icon_state = "emergency_vox"
|
||||
item_state = "emergency_vox"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
volume = 25
|
||||
|
||||
|
||||
|
||||
@@ -108,7 +108,6 @@
|
||||
icon = 'icons/obj/watertank.dmi'
|
||||
icon_state = "mister"
|
||||
item_state = "mister"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
w_class = 4.0
|
||||
amount_per_transfer_from_this = 50
|
||||
possible_transfer_amounts = list(25,50,100)
|
||||
@@ -210,7 +209,6 @@
|
||||
icon = 'icons/obj/watertank.dmi'
|
||||
icon_state = "atmos_nozzle"
|
||||
item_state = "nozzleatmos"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
safety = 0
|
||||
max_water = 200
|
||||
power = 8
|
||||
|
||||
@@ -199,7 +199,6 @@ obj/item/weapon/twohanded/
|
||||
/obj/item/weapon/twohanded/dualsaber
|
||||
var/hacked = 0
|
||||
var/blade_color
|
||||
icon_override = 'icons/mob/in-hand/swords.dmi'
|
||||
icon_state = "dualsaber0"
|
||||
name = "double-bladed energy sword"
|
||||
desc = "Handle with care."
|
||||
@@ -365,7 +364,6 @@ obj/item/weapon/twohanded/
|
||||
///CHAINSAW///
|
||||
|
||||
/obj/item/weapon/twohanded/chainsaw
|
||||
icon_override = 'icons/mob/in-hand/swords.dmi'
|
||||
icon_state = "chainsaw0"
|
||||
name = "Chainsaw"
|
||||
desc = "Perfect for felling trees or fellow spacemen."
|
||||
@@ -423,8 +421,6 @@ obj/item/weapon/twohanded/
|
||||
/obj/item/weapon/twohanded/singularityhammer
|
||||
name = "singularity hammer"
|
||||
desc = "The pinnacle of close combat technology, the hammer harnesses the power of a miniaturized singularity to deal crushing blows."
|
||||
|
||||
icon_override = 'icons/mob/in-hand/swords.dmi'
|
||||
icon_state = "mjollnir0"
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BACK
|
||||
@@ -498,7 +494,6 @@ obj/item/weapon/twohanded/
|
||||
/obj/item/weapon/twohanded/mjollnir
|
||||
name = "Mjollnir"
|
||||
desc = "A weapon worthy of a god, able to strike with the force of a lightning bolt. It crackles with barely contained energy."
|
||||
icon_override = 'icons/mob/in-hand/swords.dmi'
|
||||
icon_state = "mjollnir0"
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BACK
|
||||
@@ -546,9 +541,7 @@ obj/item/weapon/twohanded/
|
||||
/obj/item/weapon/twohanded/knighthammer
|
||||
name = "singuloth knight's hammer"
|
||||
desc = "A hammer made of sturdy metal with a golden skull adorned with wings on either side of the head. <br>This weapon causes devastating damage to those it hits due to a power field sustained by a mini-singularity inside of the hammer."
|
||||
|
||||
icon_override = 'icons/mob/in-hand/swords.dmi'
|
||||
icon_state = "adrhammer0"
|
||||
icon_state = "knighthammer0"
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BACK
|
||||
no_embed = 1
|
||||
@@ -579,7 +572,7 @@ obj/item/weapon/twohanded/
|
||||
return
|
||||
|
||||
/obj/item/weapon/twohanded/knighthammer/update_icon() //Currently only here to fuck with the on-mob icons.
|
||||
icon_state = "adrhammer[wielded]"
|
||||
icon_state = "knighthammer[wielded]"
|
||||
return
|
||||
|
||||
|
||||
|
||||
@@ -45,6 +45,12 @@ LINEN BINS
|
||||
icon_state = "sheetpurple"
|
||||
_color = "purple"
|
||||
|
||||
/obj/item/weapon/bedsheet/patriot
|
||||
name = "patriotic bedsheet"
|
||||
desc = "You've never felt more free than when sleeping on this."
|
||||
icon_state = "sheetUSA"
|
||||
_color = "sheetUSA"
|
||||
|
||||
/obj/item/weapon/bedsheet/rainbow
|
||||
name = "rainbow bedsheet"
|
||||
desc = "A multi_colored blanket. It's actually several different sheets cut up and sewn together."
|
||||
|
||||
@@ -44,11 +44,11 @@
|
||||
new /obj/item/weapon/storage/box/teargas(src)
|
||||
new /obj/item/weapon/storage/box/flashbangs(src)
|
||||
new /obj/item/weapon/storage/backpack/duffel/syndie/med(src)
|
||||
new /obj/item/weapon/gun/projectile/automatic/bulldog(src)
|
||||
new /obj/item/weapon/gun/projectile/automatic/bulldog(src)
|
||||
new /obj/item/weapon/gun/projectile/automatic/bulldog(src)
|
||||
new /obj/item/weapon/gun/projectile/automatic/bulldog(src)
|
||||
new /obj/item/weapon/gun/projectile/automatic/bulldog(src)
|
||||
new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(src)
|
||||
new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(src)
|
||||
new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(src)
|
||||
new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(src)
|
||||
new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(src)
|
||||
new /obj/item/weapon/pinpointer/nukeop(src)
|
||||
new /obj/item/weapon/pinpointer/nukeop(src)
|
||||
new /obj/item/weapon/pinpointer/nukeop(src)
|
||||
|
||||
@@ -1,55 +1,88 @@
|
||||
#define DISPLAYCASE_FRAME_CIRCUIT 0
|
||||
#define DISPLAYCASE_FRAME_SCREWDRIVER 1
|
||||
|
||||
// List and hook used to set up the captain's print on their display case
|
||||
var/global/list/captain_display_cases = list()
|
||||
|
||||
/hook/captain_spawned/proc/displaycase(mob/living/carbon/human/captain)
|
||||
if(!captain_display_cases.len)
|
||||
return 1
|
||||
var/fingerprint = captain.get_full_print()
|
||||
for(var/obj/structure/displaycase/D in captain_display_cases)
|
||||
if(istype(D))
|
||||
D.ue = fingerprint
|
||||
|
||||
return 1
|
||||
|
||||
/obj/structure/displaycase_frame
|
||||
name = "display case frame"
|
||||
icon = 'icons/obj/stock_parts.dmi'
|
||||
icon_state="box_glass"
|
||||
icon_state = "box_glass"
|
||||
var/obj/item/weapon/airlock_electronics/circuit = null
|
||||
var/state=0
|
||||
var/obj/item/device/assembly/prox_sensor/sensor = null
|
||||
var/state = DISPLAYCASE_FRAME_CIRCUIT
|
||||
|
||||
/obj/structure/displaycase_frame/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
|
||||
var/pstate=state
|
||||
var/turf/T=get_turf(src)
|
||||
var/pstate = state
|
||||
var/turf/T = get_turf(src)
|
||||
switch(state)
|
||||
if(0)
|
||||
if(istype(W, /obj/item/weapon/airlock_electronics) && W:icon_state != "door_electronics_smoked")
|
||||
if(DISPLAYCASE_FRAME_CIRCUIT)
|
||||
if(istype(W, /obj/item/weapon/airlock_electronics) && W.icon_state != "door_electronics_smoked")
|
||||
user.drop_item()
|
||||
circuit = W
|
||||
circuit.loc = src
|
||||
circuit.forceMove(src)
|
||||
state++
|
||||
playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1)
|
||||
user << "<span class='notice'>You add the airlock electronics to the frame.</span>"
|
||||
playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
if(istype(W, /obj/item/weapon/crowbar))
|
||||
new /obj/machinery/constructable_frame/machine_frame(T)
|
||||
new /obj/item/stack/sheet/glass(T)
|
||||
var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(T)
|
||||
G.amount = 5
|
||||
qdel(src)
|
||||
user << "<span class='notice'>You pry the glass out of the frame.</span>"
|
||||
playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
|
||||
return
|
||||
|
||||
if(1)
|
||||
if(DISPLAYCASE_FRAME_SCREWDRIVER)
|
||||
if(isscrewdriver(W))
|
||||
var/obj/structure/displaycase/C=new(T)
|
||||
var/obj/structure/displaycase/C = new(T)
|
||||
if(circuit.one_access)
|
||||
C.req_access = null
|
||||
C.req_one_access = circuit.conf_access
|
||||
else
|
||||
C.req_access = circuit.conf_access
|
||||
C.req_one_access = null
|
||||
if(isprox(sensor))
|
||||
C.burglar_alarm = 1
|
||||
playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1)
|
||||
qdel(src)
|
||||
return
|
||||
if(istype(W, /obj/item/weapon/crowbar))
|
||||
circuit.loc=T
|
||||
circuit=null
|
||||
circuit.forceMove(T)
|
||||
circuit = null
|
||||
if(isprox(sensor))
|
||||
sensor.forceMove(T)
|
||||
sensor = null
|
||||
state--
|
||||
user << "<span class='notice'>You pry the electronics out of the frame.</span>"
|
||||
playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
|
||||
if(pstate!=state)
|
||||
pstate=state
|
||||
if(isprox(W) && !isprox(sensor))
|
||||
user.drop_item()
|
||||
sensor = W
|
||||
sensor.forceMove(src)
|
||||
user << "<span class='notice'>You add the proximity sensor to the frame.</span>"
|
||||
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
|
||||
if(pstate != state)
|
||||
pstate = state
|
||||
update_icon()
|
||||
|
||||
/obj/structure/displaycase_frame/update_icon()
|
||||
switch(state)
|
||||
if(1)
|
||||
icon_state="box_glass_circuit"
|
||||
icon_state = "box_glass_circuit"
|
||||
else
|
||||
icon_state="box_glass"
|
||||
icon_state = "box_glass"
|
||||
|
||||
/obj/structure/displaycase
|
||||
name = "display case"
|
||||
@@ -58,42 +91,52 @@
|
||||
desc = "A display case for prized possessions. It taunts you to kick it."
|
||||
density = 1
|
||||
anchored = 1
|
||||
unacidable = 1//Dissolving the case would also delete the contents.
|
||||
unacidable = 1 //Dissolving the case would also delete the contents.
|
||||
var/health = 30
|
||||
var/obj/item/occupant = null
|
||||
var/destroyed = 0
|
||||
var/locked = 0
|
||||
var/burglar_alarm = 0
|
||||
var/ue = null
|
||||
var/image/occupant_overlay = null
|
||||
var/obj/item/weapon/airlock_electronics/circuit
|
||||
|
||||
|
||||
/obj/structure/displaycase/captains_laser
|
||||
name = "captain's display case"
|
||||
desc = "A display case for the captain's antique laser gun. It taunts you to kick it."
|
||||
desc = "A display case for the captain's antique laser gun. Hooked up with an anti-theft system."
|
||||
burglar_alarm = 1
|
||||
|
||||
/obj/structure/displaycase/captains_laser/New()
|
||||
captain_display_cases += src
|
||||
req_access = list(access_captain)
|
||||
locked = 1
|
||||
spawn(5)
|
||||
occupant = new /obj/item/weapon/gun/energy/laser/captain(src)
|
||||
update_icon()
|
||||
|
||||
/obj/structure/proc/getPrint(mob/user as mob)
|
||||
return md5(user:dna:uni_identity)
|
||||
|
||||
|
||||
/obj/structure/displaycase/Destroy()
|
||||
dump()
|
||||
qdel(circuit)
|
||||
circuit = null
|
||||
return ..()
|
||||
|
||||
/obj/structure/displaycase/captain_laser/Destroy()
|
||||
captain_display_cases -= src
|
||||
return ..()
|
||||
|
||||
/obj/structure/displaycase/examine(mob/user)
|
||||
..(user)
|
||||
user << "\blue Peering through the glass, you see that it contains:"
|
||||
user << "<span class='notice'>Peering through the glass, you see that it contains:</span>"
|
||||
if(occupant)
|
||||
user << "\icon[occupant] \blue \A [occupant]"
|
||||
user << "\icon[occupant] <span class='notice'>\A [occupant].</span>"
|
||||
else
|
||||
user << "Nothing."
|
||||
|
||||
/obj/structure/displaycase/proc/dump()
|
||||
if(occupant)
|
||||
occupant.loc=get_turf(src)
|
||||
occupant=null
|
||||
occupant_overlay=null
|
||||
occupant.forceMove(get_turf(src))
|
||||
occupant = null
|
||||
occupant_overlay = null
|
||||
|
||||
/obj/structure/displaycase/ex_act(severity)
|
||||
switch(severity)
|
||||
@@ -111,7 +154,6 @@
|
||||
src.health -= 5
|
||||
src.healthcheck()
|
||||
|
||||
|
||||
/obj/structure/displaycase/bullet_act(var/obj/item/projectile/Proj)
|
||||
if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
|
||||
health -= Proj.damage
|
||||
@@ -127,16 +169,27 @@
|
||||
|
||||
/obj/structure/displaycase/proc/healthcheck()
|
||||
if (src.health <= 0)
|
||||
health = 0
|
||||
if (!( src.destroyed ))
|
||||
src.density = 0
|
||||
src.destroyed = 1
|
||||
PoolOrNew(/obj/item/weapon/shard, loc)
|
||||
playsound(get_turf(src), "shatter", 70, 1)
|
||||
update_icon()
|
||||
|
||||
burglar_alarm()
|
||||
else
|
||||
playsound(get_turf(src), 'sound/effects/Glasshit.ogg', 75, 1)
|
||||
return
|
||||
|
||||
|
||||
/obj/structure/displaycase/proc/burglar_alarm()
|
||||
if(burglar_alarm)
|
||||
var/area/alarmed = get_area(src)
|
||||
alarmed.burglaralert(src)
|
||||
visible_message("<span class='danger'>The burglar alarm goes off!</span>")
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/structure/displaycase/update_icon()
|
||||
if(src.destroyed)
|
||||
src.icon_state = "glassbox2b"
|
||||
@@ -147,102 +200,110 @@
|
||||
var/icon/occupant_icon=getFlatIcon(occupant)
|
||||
occupant_icon.Scale(16,16)
|
||||
occupant_overlay = image(occupant_icon)
|
||||
occupant_overlay.pixel_x=8
|
||||
occupant_overlay.pixel_y=8
|
||||
occupant_overlay.pixel_x = 8
|
||||
occupant_overlay.pixel_y = 8
|
||||
if(locked)
|
||||
occupant_overlay.alpha=128//ChangeOpacity(0.5)
|
||||
//underlays += occupant_overlay
|
||||
occupant_overlay.alpha = 128
|
||||
overlays += occupant_overlay
|
||||
return
|
||||
|
||||
|
||||
/obj/structure/displaycase/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
|
||||
if(istype(W, /obj/item/weapon/card))
|
||||
var/obj/item/weapon/card/id/I=W
|
||||
var/obj/item/weapon/card/id/I = W
|
||||
if(!check_access(I))
|
||||
user << "\red Access denied."
|
||||
user << "<span class='warning'>Access denied.</span>"
|
||||
return
|
||||
locked = !locked
|
||||
if(!locked)
|
||||
user << "\icon[src] \blue \The [src] clicks as locks release, and it slowly opens for you."
|
||||
user << "\icon[src] <span class='notice'>\The [src] clicks as locks release, and it slowly opens for you.</span>"
|
||||
else
|
||||
user << "\icon[src] \blue You close \the [src] and swipe your card, locking it."
|
||||
user << "\icon[src] <span class='notice'>You close \the [src] and swipe your card, locking it.</span>"
|
||||
update_icon()
|
||||
return
|
||||
if(istype(W,/obj/item/weapon/crowbar) && (!locked || destroyed))
|
||||
user.visible_message("[user.name] pries \the [src] apart.", \
|
||||
"You pry \the [src] apart.", \
|
||||
"You hear something pop.")
|
||||
var/turf/T=get_turf(src)
|
||||
var/turf/T = get_turf(src)
|
||||
playsound(T, 'sound/items/Crowbar.ogg', 50, 1)
|
||||
dump()
|
||||
var/obj/item/weapon/airlock_electronics/C = circuit
|
||||
if(!C)
|
||||
C=new (src)
|
||||
C.one_access=!(req_access && req_access.len>0)
|
||||
C = new (src)
|
||||
C.one_access = !(req_access && req_access.len>0)
|
||||
if(!C.one_access)
|
||||
C.conf_access=req_access
|
||||
C.conf_access = req_access
|
||||
else
|
||||
C.conf_access=req_one_access
|
||||
C.conf_access = req_one_access
|
||||
|
||||
if(!destroyed)
|
||||
var/obj/structure/displaycase_frame/F=new(T)
|
||||
F.state=1
|
||||
F.circuit=C
|
||||
F.circuit.loc=F
|
||||
var/obj/structure/displaycase_frame/F = new(T)
|
||||
F.state = DISPLAYCASE_FRAME_SCREWDRIVER
|
||||
F.circuit = C
|
||||
F.circuit.forceMove(F)
|
||||
if(burglar_alarm)
|
||||
new /obj/item/device/assembly/prox_sensor(T)
|
||||
F.update_icon()
|
||||
else
|
||||
C.loc=T
|
||||
circuit=null
|
||||
C.forceMove(T)
|
||||
circuit = null
|
||||
new /obj/machinery/constructable_frame/machine_frame(T)
|
||||
qdel(src)
|
||||
return
|
||||
if(user.a_intent == I_HARM)
|
||||
src.health -= W.force
|
||||
src.healthcheck()
|
||||
..()
|
||||
if(locked && !destroyed)
|
||||
src.health -= W.force
|
||||
src.healthcheck()
|
||||
..()
|
||||
else if(!locked)
|
||||
dump()
|
||||
user << "<span class='danger'>You smash \the [W] into the delicate electronics at the bottom of the case, and deactivate the hover field.</span>"
|
||||
update_icon()
|
||||
else
|
||||
if(locked)
|
||||
user << "\red It's locked, you can't put anything into it."
|
||||
user << "<span class='warning'>It's locked, you can't put anything into it.</span>"
|
||||
return
|
||||
if(!occupant)
|
||||
user << "\blue You insert \the [W] into \the [src], and it floats as the hoverfield activates."
|
||||
user << "<span class='notice'>You insert \the [W] into \the [src], and it floats as the hoverfield activates.</span>"
|
||||
user.drop_item()
|
||||
W.loc=src
|
||||
W.forceMove(src)
|
||||
occupant=W
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/structure/displaycase/attack_hand(mob/user as mob)
|
||||
if (destroyed)
|
||||
if (destroyed || (!locked && user.a_intent == I_HARM))
|
||||
if(occupant)
|
||||
dump()
|
||||
user << "\red You smash your fist into the delicate electronics at the bottom of the case, and deactivate the hover field permanently."
|
||||
user << "<span class='danger'>You smash your fist into the delicate electronics at the bottom of the case, and deactivate the hover field.</span>"
|
||||
src.add_fingerprint(user)
|
||||
update_icon()
|
||||
else
|
||||
if(user.a_intent == I_HARM)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(src)
|
||||
user.visible_message("\red [user.name] kicks \the [src]!", \
|
||||
"\red You kick \the [src]!", \
|
||||
user.visible_message("<span class='danger'>[user.name] kicks \the [src]!</span>", \
|
||||
"<span class='danger'>You kick \the [src]!</span>", \
|
||||
"You hear glass crack.")
|
||||
src.health -= 2
|
||||
healthcheck()
|
||||
else if(!locked)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/print = H.get_full_print()
|
||||
if(!ue)
|
||||
user << "\blue Your press your thumb against the fingerprint scanner, registering your identity with the case."
|
||||
ue = getPrint(user)
|
||||
user << "<span class='notice'>Your press your thumb against the fingerprint scanner, registering your identity with the case.</span>"
|
||||
ue = print
|
||||
return
|
||||
if(ue!=getPrint(user))
|
||||
user << "\red Access denied."
|
||||
if(ue != print)
|
||||
user << "<span class='warning'>Access denied.</span>"
|
||||
return
|
||||
|
||||
if(occupant)
|
||||
user << "\blue Your press your thumb against the fingerprint scanner, and deactivate the hover field built into the case."
|
||||
user << "<span class='notice'>Your press your thumb against the fingerprint scanner, and deactivate the hover field built into the case.</span>"
|
||||
dump()
|
||||
update_icon()
|
||||
else
|
||||
src << "\icon[src] \red \The [src] is empty!"
|
||||
src << "\icon[src] <span class='warning'>\The [src] is empty!</span>"
|
||||
else
|
||||
user.visible_message("[user.name] gently runs his hands over \the [src] in appreciation of its contents.", \
|
||||
"You gently run your hands over \the [src] in appreciation of its contents.", \
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
handle_rotation()
|
||||
if(pulling) // Driver
|
||||
if(pulling.loc == src.loc) // We moved onto the wheelchair? Revert!
|
||||
pulling.loc = T
|
||||
pulling.forceMove(T)
|
||||
else
|
||||
spawn(0)
|
||||
if(get_dist(src, pulling) > 1) // We are too far away? Losing control.
|
||||
@@ -95,7 +95,7 @@
|
||||
pulling = null
|
||||
else
|
||||
if (occupant && (src.loc != occupant.loc))
|
||||
src.loc = occupant.loc // Failsafe to make sure the wheelchair stays beneath the occupant after driving
|
||||
forceMove(occupant.loc) // Failsafe to make sure the wheelchair stays beneath the occupant after driving
|
||||
handle_rotation()
|
||||
|
||||
/obj/structure/stool/bed/chair/wheelchair/attack_hand(mob/user as mob)
|
||||
|
||||
@@ -848,6 +848,7 @@
|
||||
anchored = 1.0
|
||||
throwpass = 1 //You can throw objects over this, despite it's density.
|
||||
var/parts = /obj/item/weapon/rack_parts
|
||||
var/health = 5
|
||||
|
||||
/obj/structure/rack/proc/destroy()
|
||||
new parts(loc)
|
||||
@@ -914,6 +915,14 @@
|
||||
visible_message("<span class='danger'>[user] smashes [src] apart!</span>")
|
||||
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
|
||||
destroy()
|
||||
else
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(src)
|
||||
playsound(loc, 'sound/items/dodgeball.ogg', 80, 1)
|
||||
user.visible_message("<span class='warning'>[user] kicks [src].</span>", \
|
||||
"<span class='danger'>You kick [src].</span>")
|
||||
health -= rand(1,2)
|
||||
healthcheck()
|
||||
|
||||
/obj/structure/rack/mech_melee_attack(obj/mecha/M)
|
||||
visible_message("<span class='danger'>[M] smashes [src] apart!</span>")
|
||||
@@ -933,3 +942,7 @@
|
||||
|
||||
/obj/structure/rack/attack_tk() // no telehulk sorry
|
||||
return
|
||||
|
||||
/obj/structure/rack/proc/healthcheck()
|
||||
if(health <= 0)
|
||||
destroy()
|
||||
@@ -138,6 +138,7 @@ var/list/mechtoys = list(
|
||||
var/ordernum
|
||||
var/datum/supply_packs/object = null
|
||||
var/orderedby = null
|
||||
var/orderedrank = null
|
||||
var/comment = null
|
||||
|
||||
/datum/controller/supply
|
||||
@@ -300,14 +301,19 @@ var/list/mechtoys = list(
|
||||
var/datum/supply_packs/SP = SO.object
|
||||
|
||||
var/atom/A = new SP.containertype(pickedloc)
|
||||
A.name = "[SP.containername]"// [SO.comment ? "([SO.comment])":"" ]"
|
||||
A.name = "[SP.containername]"
|
||||
|
||||
//supply manifest generation begin
|
||||
|
||||
var/obj/item/weapon/paper/manifest/slip = new /obj/item/weapon/paper/manifest(A)
|
||||
slip.name = "Shipping Manifest - '[SP.name]' for [SO.orderedby]"
|
||||
slip.info = "<h3>[command_name()] Shipping Manifest</h3><hr><br>"
|
||||
slip.info +="Order #[SO.ordernum]<br>"
|
||||
slip.info +="Order: #[SO.ordernum]<br>"
|
||||
slip.info +="Destination: [station_name]<br>"
|
||||
slip.info +="Requested By: [SO.orderedby]<br>"
|
||||
slip.info +="Rank: [SO.orderedrank]<br>"
|
||||
slip.info +="Reason: [SO.comment]<br>"
|
||||
slip.info +="Supply Crate Type: [SP.name]<br>"
|
||||
slip.info +="Access Restriction: [replacetext(get_access_desc(SP.access))]<br>"
|
||||
slip.info +="[shoppinglist.len] PACKAGES IN THIS SHIPMENT<br>"
|
||||
slip.info +="CONTENTS:<br><ul>"
|
||||
|
||||
@@ -482,6 +488,7 @@ var/list/mechtoys = list(
|
||||
O.ordernum = supply_controller.ordernum
|
||||
O.object = P
|
||||
O.orderedby = idname
|
||||
O.orderedrank = idrank
|
||||
O.comment = reason
|
||||
supply_controller.requestlist += O
|
||||
|
||||
@@ -691,6 +698,7 @@ var/list/mechtoys = list(
|
||||
O.ordernum = supply_controller.ordernum
|
||||
O.object = P
|
||||
O.orderedby = idname
|
||||
O.orderedrank = idrank
|
||||
O.comment = reason
|
||||
supply_controller.requestlist += O
|
||||
|
||||
|
||||
@@ -606,7 +606,7 @@ var/global/nologevent = 0
|
||||
return
|
||||
if(confirm == "Yes")
|
||||
var/delay = input("What delay should the restart have (in seconds)?", "Restart Delay", 5) as num
|
||||
if(!delay)
|
||||
if(isnull(delay))
|
||||
delay = 50
|
||||
else
|
||||
delay = delay * 10
|
||||
|
||||
@@ -2,16 +2,14 @@
|
||||
set name = "Broken Sprite List"
|
||||
set category = "Debug"
|
||||
|
||||
var/icon/IL = new('icons/mob/items_lefthand.dmi')
|
||||
var/list/Lstates = IL.IconStates()
|
||||
var/icon/IR = new('icons/mob/items_righthand.dmi')
|
||||
var/list/Rstates = IR.IconStates()
|
||||
|
||||
|
||||
var/text
|
||||
for(var/A in typesof(/obj/item))
|
||||
var/obj/item/O = new A( locate(1,1,1) )
|
||||
if(!O) continue
|
||||
var/icon/IL = new(O.lefthand_file)
|
||||
var/list/Lstates = IL.IconStates()
|
||||
var/icon/IR = new(O.righthand_file)
|
||||
var/list/Rstates = IR.IconStates()
|
||||
var/icon/J = new(O.icon)
|
||||
var/list/istates = J.IconStates()
|
||||
if(!Lstates.Find(O.icon_state) && !Lstates.Find(O.item_state))
|
||||
|
||||
@@ -704,7 +704,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/cloaking_device(M), slot_r_store)
|
||||
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic(M), slot_r_hand)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/proto(M), slot_r_hand)
|
||||
M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_l_store)
|
||||
|
||||
if ("tournament chef") //Steven Seagal FTW
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
msg = "\blue \icon[cross] <b><font color=purple>PRAY: </font>[key_name(src, 1)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[src]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=\ref[src]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[src]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[src]'>SM</A>) ([admin_jump_link(src, "holder")]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;adminspawncookie=\ref[src]'>SC</a>):</b> [msg]"
|
||||
|
||||
for(var/client/X in admins)
|
||||
if(R_EVENT & X.holder.rights)
|
||||
if(check_rights(R_EVENT,0,X.mob))
|
||||
X << msg
|
||||
|
||||
usr << "Your prayers have been received by the gods."
|
||||
@@ -37,7 +37,7 @@
|
||||
msg = "\blue <b><font color='#DC143C'>SYNDICATE: </font>[key_name(Sender, 1)] (<A HREF='?_src_=holder;adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[Sender]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[Sender]'>SM</A>) ([admin_jump_link(Sender, "holder")]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;BlueSpaceArtillery=\ref[Sender]'>BSA</A>) (<A HREF='?_src_=holder;SyndicateReply=\ref[Sender]'>REPLY</A>):</b> [msg]"
|
||||
|
||||
for(var/client/X in admins)
|
||||
if(R_EVENT & X.holder.rights)
|
||||
if(check_rights(R_EVENT,0,X.mob))
|
||||
X << msg
|
||||
|
||||
/proc/HONK_announce(var/text , var/mob/Sender)
|
||||
@@ -53,12 +53,16 @@
|
||||
msg = "\blue <b><font color=orange>ERT REQUEST: </font>[key_name(Sender, 1)] (<A HREF='?_src_=holder;adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[Sender]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[Sender]'>SM</A>) ([admin_jump_link(Sender, "holder")]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;BlueSpaceArtillery=\ref[Sender]'>BSA</A>) (<A HREF='?_src_=holder;ErtReply=\ref[Sender]'>REPLY</A>):</b> [msg]"
|
||||
|
||||
for(var/client/X in admins)
|
||||
if(R_EVENT & X.holder.rights)
|
||||
if(check_rights(R_EVENT,0,X.mob))
|
||||
X << msg
|
||||
|
||||
/proc/Nuke_request(text , mob/Sender)
|
||||
var/nuke_code = get_nuke_code()
|
||||
var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN))
|
||||
msg = "<span class='adminnotice'><b><font color=orange>NUKE CODE REQUEST: </font>[key_name(Sender)] (<A HREF='?_src_=holder;adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[Sender]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[Sender]'>SM</A>) ([admin_jump_link(Sender, "holder")]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;BlueSpaceArtillery=\ref[Sender]'>BSA</A>) (<A HREF='?_src_=holder;CentcommReply=\ref[Sender]'>RPLY</A>):</b> [msg]</span>"
|
||||
admins << msg
|
||||
admins << "<span class='adminnotice'><b>The nuke code is [nuke_code].</b></span>"
|
||||
|
||||
for(var/client/X in admins)
|
||||
if(check_rights(R_EVENT,0,X.mob))
|
||||
X << msg
|
||||
X << "<span class='adminnotice'><b>The nuke code is [nuke_code].</b></span>"
|
||||
|
||||
@@ -160,7 +160,7 @@ var/global/sent_syndicate_strike_team = 0
|
||||
equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword(src), slot_l_store)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/grenade/empgrenade(src), slot_r_store)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(src), slot_s_store)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/m2411(src), slot_belt)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/pistol/m2411(src), slot_belt)
|
||||
|
||||
equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/l6_saw(src), slot_r_hand)
|
||||
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
/datum/alarm_handler/burglar
|
||||
category = "Burglar Alarms"
|
||||
@@ -128,6 +128,7 @@ datum/preferences
|
||||
var/species = "Human"
|
||||
var/language = "None" //Secondary language
|
||||
|
||||
var/body_accessory = null
|
||||
|
||||
var/speciesprefs = 0//I hate having to do this, I really do (Using this for oldvox code, making names universal I guess
|
||||
|
||||
@@ -366,10 +367,14 @@ datum/preferences
|
||||
dat += "<br><b>Eyes</b><br>"
|
||||
dat += "<a href='?_src_=prefs;preference=eyes;task=input'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(r_eyes, 2)][num2hex(g_eyes, 2)][num2hex(b_eyes, 2)]'><table style='display:inline;' bgcolor='#[num2hex(r_eyes, 2)][num2hex(g_eyes, 2)][num2hex(b_eyes)]'><tr><td>__</td></tr></table></font><br>"
|
||||
|
||||
if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People" || species == "Vulpkanin")
|
||||
if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People" || species == "Vulpkanin" || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) //admins can always fuck with this, because they are admins
|
||||
dat += "<br><b>Body Color</b><br>"
|
||||
dat += "<a href='?_src_=prefs;preference=skin;task=input'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(r_skin, 2)][num2hex(g_skin, 2)][num2hex(b_skin, 2)]'><table style='display:inline;' bgcolor='#[num2hex(r_skin, 2)][num2hex(g_skin, 2)][num2hex(b_skin)]'><tr><td>__</td></tr></table></font>"
|
||||
|
||||
if(body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user))
|
||||
dat += "<br><b>Body Accessory</b><br>"
|
||||
dat += "Accessory: <a href='?_src_=prefs;preference=body_accessory;task=input'>[body_accessory ? "[body_accessory]" : "None"]</a><br>"
|
||||
|
||||
dat += "</td></tr></table><hr><center>"
|
||||
|
||||
if (1) // General Preferences
|
||||
@@ -1165,10 +1170,27 @@ datum/preferences
|
||||
|
||||
valid_hairstyles[hairstyle] = hair_styles_list[hairstyle]
|
||||
|
||||
var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in valid_hairstyles
|
||||
var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in valid_hairstyles
|
||||
if(new_h_style)
|
||||
h_style = new_h_style
|
||||
|
||||
if("body_accessory")
|
||||
var/list/possible_body_accessories = list()
|
||||
if(check_rights(R_ADMIN, 1, user))
|
||||
possible_body_accessories = body_accessory_by_name.Copy()
|
||||
else
|
||||
for(var/B in body_accessory_by_name)
|
||||
var/datum/body_accessory/accessory = body_accessory_by_name[B]
|
||||
if(!istype(accessory))
|
||||
possible_body_accessories += "None" //the only null entry should be the "None" option
|
||||
continue
|
||||
if(species in accessory.allowed_species)
|
||||
possible_body_accessories += B
|
||||
|
||||
var/new_body_accessory = input(user, "Choose your body accessory:", "Character Preference") as null|anything in possible_body_accessories
|
||||
if(new_body_accessory)
|
||||
body_accessory = new_body_accessory
|
||||
|
||||
if("facial")
|
||||
var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference") as color|null
|
||||
if(new_facial)
|
||||
@@ -1246,7 +1268,7 @@ datum/preferences
|
||||
s_tone = 35 - max(min( round(new_s_tone), 220),1)
|
||||
|
||||
if("skin")
|
||||
if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People"|| species == "Vulpkanin")
|
||||
if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People"|| species == "Vulpkanin" || body_accessory_by_species[species] || check_rights(R_ADMIN, 1, user))
|
||||
var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference") as color|null
|
||||
if(new_skin)
|
||||
r_skin = hex2num(copytext(new_skin, 2, 4))
|
||||
@@ -1571,6 +1593,9 @@ datum/preferences
|
||||
character.undershirt = undershirt
|
||||
character.socks = socks
|
||||
|
||||
if(body_accessory)
|
||||
character.body_accessory = body_accessory_by_name["[body_accessory]"]
|
||||
|
||||
if(backbag > 4 || backbag < 1)
|
||||
backbag = 1 //Same as above
|
||||
character.backbag = backbag
|
||||
|
||||
@@ -151,7 +151,8 @@
|
||||
|
||||
//socks
|
||||
socks = query.item[54]
|
||||
|
||||
body_accessory = query.item[55]
|
||||
|
||||
//Sanitize
|
||||
metadata = sanitize_text(metadata, initial(metadata))
|
||||
real_name = reject_bad_name(real_name)
|
||||
@@ -200,7 +201,7 @@
|
||||
be_special = sanitize_integer(be_special, 0, 65535, initial(be_special))
|
||||
|
||||
socks = sanitize_text(socks, initial(socks))
|
||||
|
||||
body_accessory = sanitize_text(body_accessory, initial(body_accessory))
|
||||
|
||||
// if(isnull(disabilities)) disabilities = 0
|
||||
if(!player_alt_titles) player_alt_titles = new()
|
||||
@@ -274,7 +275,8 @@
|
||||
rlimb_data='[rlimblist]',
|
||||
nanotrasen_relation='[nanotrasen_relation]',
|
||||
speciesprefs='[speciesprefs]',
|
||||
socks='[socks]'
|
||||
socks='[socks]',
|
||||
body_accessory='[body_accessory]'
|
||||
WHERE ckey='[C.ckey]'
|
||||
AND slot='[default_slot]'"}
|
||||
)
|
||||
@@ -302,7 +304,9 @@
|
||||
job_karma_high, job_karma_med, job_karma_low,
|
||||
flavor_text, med_record, sec_record, gen_record,
|
||||
player_alt_titles, be_special,
|
||||
disabilities, organ_data, rlimb_data, nanotrasen_relation, speciesprefs, socks)
|
||||
disabilities, organ_data, rlimb_data, nanotrasen_relation, speciesprefs,
|
||||
socks, body_accessory)
|
||||
|
||||
VALUES
|
||||
('[C.ckey]', '[default_slot]', '[sql_sanitize_text(metadata)]', '[sql_sanitize_text(real_name)]', '[be_random_name]','[gender]',
|
||||
'[age]', '[sql_sanitize_text(species)]', '[sql_sanitize_text(language)]',
|
||||
@@ -319,7 +323,9 @@
|
||||
'[job_karma_high]', '[job_karma_med]', '[job_karma_low]',
|
||||
'[sql_sanitize_text(flavor_text)]', '[sql_sanitize_text(med_record)]', '[sql_sanitize_text(sec_record)]', '[sql_sanitize_text(gen_record)]',
|
||||
'[playertitlelist]', '[be_special]',
|
||||
'[disabilities]', '[organlist]', '[rlimblist]', '[nanotrasen_relation]', '[speciesprefs]','[socks]')
|
||||
'[disabilities]', '[organlist]', '[rlimblist]', '[nanotrasen_relation]', '[speciesprefs]',
|
||||
'[socks]', '[body_accessory]')
|
||||
|
||||
"}
|
||||
)
|
||||
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
while sprite_sheets should be used for "flexible" clothing items that do not need to be refitted (e.g. vox wearing jumpsuits).
|
||||
*/
|
||||
var/list/sprite_sheets_refit = null
|
||||
lefthand_file = 'icons/mob/inhands/clothing_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/clothing_righthand.dmi'
|
||||
|
||||
//BS12: Species-restricted clothing check.
|
||||
/obj/item/clothing/mob_can_equip(M as mob, slot)
|
||||
|
||||
@@ -174,3 +174,23 @@
|
||||
desc = "An EVA suit specifically designed for the clown. SPESSHONK!"
|
||||
icon_state = "spaceclown_suit"
|
||||
item_state = "spaceclown_items"
|
||||
|
||||
/obj/item/clothing/head/helmet/space/freedom
|
||||
name = "eagle helmet"
|
||||
desc = "An advanced, space-proof helmet. It appears to be modeled after an old-world eagle."
|
||||
icon_state = "griffinhat"
|
||||
item_state = "griffinhat"
|
||||
armor = list(melee = 40, bullet = 40, laser = 30, energy = 25, bomb = 100, bio = 100, rad = 100)
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
|
||||
unacidable = 1
|
||||
|
||||
/obj/item/clothing/suit/space/freedom
|
||||
name = "eagle suit"
|
||||
desc = "An advanced, light suit, fabricated from a mixture of synthetic feathers and space-resistant material. A gun holster appears to be integrated into the suit and the wings appear to be stuck in 'freedom' mode."
|
||||
icon_state = "freedom"
|
||||
item_state = "freedom"
|
||||
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
|
||||
armor = list(melee = 40, bullet = 40, laser = 30,energy = 25, bomb = 100, bio = 100, rad = 100)
|
||||
slowdown = 1
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
|
||||
unacidable = 1
|
||||
|
||||
@@ -11,6 +11,13 @@
|
||||
icon_state = "blue_pyjamas"
|
||||
_color = "blue_pyjamas"
|
||||
item_state = "w_suit"
|
||||
|
||||
/obj/item/clothing/under/patriotsuit
|
||||
name = "Patriotic Suit"
|
||||
desc = "Motorcycle not included."
|
||||
icon_state = "ek"
|
||||
item_state = "ek"
|
||||
_color = "ek"
|
||||
|
||||
/obj/item/clothing/under/captain_fly
|
||||
name = "rogue captains uniform"
|
||||
|
||||
@@ -148,3 +148,10 @@ var/global/datum/controller/plants/plant_controller // Set in New().
|
||||
|
||||
/datum/controller/plants/proc/remove_plant(var/obj/effect/plant/plant)
|
||||
plant_queue -= plant
|
||||
|
||||
/client/proc/list_plant_sprites()
|
||||
if(!plant_controller || !plant_controller.plant_sprites || !plant_controller.plant_sprites.len)
|
||||
world << "Cannot list plant sprites, plant controller or plant sprites list may not be initialized."
|
||||
|
||||
for(var/base in plant_controller.plant_sprites)
|
||||
world << "[base] : [plant_controller.plant_sprites[base]] growth states"
|
||||
@@ -43,10 +43,11 @@
|
||||
kitchen_tag = "ghostchili"
|
||||
preset_icon = "ghostchilipepper"
|
||||
|
||||
/datum/seed/chili/ice/New()
|
||||
/datum/seed/chili/ghost/New()
|
||||
..()
|
||||
set_trait(TRAIT_MATURATION,4)
|
||||
set_trait(TRAIT_PRODUCTION,4)
|
||||
set_trait(TRAIT_MATURATION,10)
|
||||
set_trait(TRAIT_PRODUCTION,10)
|
||||
set_trait(TRAIT_YIELD,3)
|
||||
set_trait(TRAIT_PRODUCT_COLOUR,"#00EDC6")
|
||||
|
||||
// Berry plants/variants.
|
||||
|
||||
@@ -133,6 +133,8 @@
|
||||
)
|
||||
//--FalseIncarnate
|
||||
|
||||
var/last_plant_ikey //This is for debugging reference, and is otherwise useless. --FalseIncarnate
|
||||
|
||||
/obj/machinery/portable_atmospherics/hydroponics/AltClick()
|
||||
if(mechanical && !usr.stat && !usr.lying && Adjacent(usr))
|
||||
close_lid(usr)
|
||||
|
||||
@@ -36,7 +36,9 @@
|
||||
if(age >= seed.get_trait(TRAIT_MATURATION))
|
||||
overlay_stage = seed.growth_stages
|
||||
else
|
||||
var/maturation = round(seed.get_trait(TRAIT_MATURATION)/seed.growth_stages)
|
||||
var/maturation = seed.get_trait(TRAIT_MATURATION)/seed.growth_stages
|
||||
if(maturation < 1)
|
||||
maturation = 1
|
||||
overlay_stage = maturation ? max(1,round(age/maturation)) : 1
|
||||
var/ikey = "[seed.get_trait(TRAIT_PLANT_ICON)]-[overlay_stage]"
|
||||
var/image/plant_overlay = plant_controller.plant_icon_cache["[ikey]-[seed.get_trait(TRAIT_PLANT_COLOUR)]"]
|
||||
@@ -45,6 +47,7 @@
|
||||
plant_overlay.color = seed.get_trait(TRAIT_PLANT_COLOUR)
|
||||
plant_controller.plant_icon_cache["[ikey]-[seed.get_trait(TRAIT_PLANT_COLOUR)]"] = plant_overlay
|
||||
overlays |= plant_overlay
|
||||
last_plant_ikey = ikey
|
||||
|
||||
if(harvest && overlay_stage == seed.growth_stages)
|
||||
ikey = "[seed.get_trait(TRAIT_PRODUCT_ICON)]"
|
||||
|
||||
@@ -159,7 +159,7 @@
|
||||
var/new_type = pick(
|
||||
200; /obj/item/weapon/hatchet, \
|
||||
/obj/item/weapon/gun/projectile/automatic/pistol, \
|
||||
/obj/item/weapon/gun/projectile/automatic/deagle, \
|
||||
/obj/item/weapon/gun/projectile/automatic/pistol/deagle, \
|
||||
/obj/item/weapon/gun/projectile/revolver/russian, \
|
||||
)
|
||||
new new_type(C)
|
||||
|
||||
@@ -101,22 +101,23 @@
|
||||
inserted_id = I
|
||||
interact(user)
|
||||
return
|
||||
|
||||
if(exchange_parts(user, W))
|
||||
return
|
||||
|
||||
if(default_deconstruction_crowbar(W))
|
||||
return
|
||||
|
||||
if(default_unfasten_wrench(user, W))
|
||||
return
|
||||
if(default_deconstruction_screwdriver(user, "ore_redemption-open", "ore_redemption", W))
|
||||
updateUsrDialog()
|
||||
return
|
||||
if(panel_open)
|
||||
if(istype(W, /obj/item/weapon/crowbar))
|
||||
empty_content()
|
||||
default_deconstruction_crowbar(W)
|
||||
return 1
|
||||
return
|
||||
|
||||
if(default_unfasten_wrench(user, W))
|
||||
return
|
||||
|
||||
if(default_deconstruction_screwdriver(user, "ore_redemption-open", "ore_redemption", W))
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
..()
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/proc/SmeltMineral(var/obj/item/weapon/ore/O)
|
||||
@@ -253,7 +254,7 @@
|
||||
while(s.amount > s.max_amount)
|
||||
new s.type(loc,s.max_amount)
|
||||
s.use(s.max_amount)
|
||||
s.loc = loc
|
||||
s.forceMove(loc)
|
||||
s.layer = initial(s.layer)
|
||||
|
||||
/**********************Mining Equipment Locker**************************/
|
||||
@@ -734,7 +735,6 @@
|
||||
icon = 'icons/obj/syringe.dmi'
|
||||
icon_state = "lazarus_hypo"
|
||||
item_state = "hypo"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
throwforce = 0
|
||||
w_class = 2.0
|
||||
throw_speed = 3
|
||||
|
||||
@@ -110,7 +110,6 @@
|
||||
icon = 'icons/obj/mining.dmi'
|
||||
icon_state = "Gibtonite ore"
|
||||
item_state = "Gibtonite ore"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
w_class = 4
|
||||
throw_range = 0
|
||||
anchored = 1 //Forces people to carry it by hand, no pulling!
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
if(!istype(W))
|
||||
return 0
|
||||
if(!l_hand)
|
||||
W.loc = src //TODO: move to equipped?
|
||||
W.forceMove(src) //TODO: move to equipped?
|
||||
l_hand = W
|
||||
W.layer = 20 //TODO: move to equipped?
|
||||
// l_hand.screen_loc = ui_lhand
|
||||
@@ -45,7 +45,7 @@
|
||||
if(!istype(W))
|
||||
return 0
|
||||
if(!r_hand)
|
||||
W.loc = src
|
||||
W.forceMove(src)
|
||||
r_hand = W
|
||||
W.layer = 20
|
||||
// r_hand.screen_loc = ui_rhand
|
||||
@@ -71,7 +71,7 @@
|
||||
//This is probably the main one you need to know :)
|
||||
//Just puts stuff on the floor for most mobs, since all mobs have hands but putting stuff in the AI/corgi/ghost hand is VERY BAD.
|
||||
/mob/proc/put_in_hands(obj/item/W)
|
||||
W.loc = get_turf(src)
|
||||
W.forceMove(get_turf(src))
|
||||
W.layer = initial(W.layer)
|
||||
W.dropped()
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
if(I)
|
||||
if(client)
|
||||
client.screen -= I
|
||||
I.loc = loc
|
||||
I.forceMove(loc)
|
||||
I.dropped(src)
|
||||
if(I)
|
||||
I.layer = initial(I.layer)
|
||||
@@ -249,13 +249,13 @@
|
||||
if (src.back && istype(src.back, /obj/item/weapon/storage/backpack))
|
||||
var/obj/item/weapon/storage/backpack/B = src.back
|
||||
if(B.contents.len < B.storage_slots && W.w_class <= B.max_w_class)
|
||||
W.loc = B
|
||||
W.forceMove(B)
|
||||
equipped = 1
|
||||
|
||||
if(equipped)
|
||||
W.layer = 20
|
||||
if(src.back && W.loc != src.back)
|
||||
W.loc = src
|
||||
W.forceMove(src)
|
||||
else
|
||||
if (del_on_fail)
|
||||
qdel(W)
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
|
||||
#define AUTOHISS_OFF 0
|
||||
#define AUTOHISS_BASIC 1
|
||||
#define AUTOHISS_FULL 2
|
||||
|
||||
#define AUTOHISS_NUM 3
|
||||
|
||||
|
||||
/mob/living/proc/handle_autohiss(message, datum/language/L)
|
||||
return message // no autohiss at this level
|
||||
|
||||
/mob/living/carbon/human/handle_autohiss(message, datum/language/L)
|
||||
if(!client || client.autohiss_mode == AUTOHISS_OFF) // no need to process if there's no client or they have autohiss off
|
||||
return message
|
||||
return species.handle_autohiss(message, L, client.autohiss_mode)
|
||||
|
||||
/client
|
||||
var/autohiss_mode = AUTOHISS_OFF
|
||||
|
||||
/client/verb/toggle_autohiss()
|
||||
set name = "Toggle Auto-Accent"
|
||||
set desc = "Toggle automatic accents for your species"
|
||||
set category = "OOC"
|
||||
|
||||
autohiss_mode = (autohiss_mode + 1) % AUTOHISS_NUM
|
||||
switch(autohiss_mode)
|
||||
if(AUTOHISS_OFF)
|
||||
src << "Auto-hiss is now OFF."
|
||||
if(AUTOHISS_BASIC)
|
||||
src << "Auto-hiss is now BASIC."
|
||||
if(AUTOHISS_FULL)
|
||||
src << "Auto-hiss is now FULL."
|
||||
else
|
||||
autohiss_mode = AUTOHISS_OFF
|
||||
src << "Auto-hiss is now OFF."
|
||||
|
||||
/datum/species
|
||||
var/list/autohiss_basic_map = null
|
||||
var/list/autohiss_extra_map = null
|
||||
var/list/autohiss_exempt = null
|
||||
|
||||
/datum/species/unathi
|
||||
autohiss_basic_map = list(
|
||||
"s" = list("ss", "sss", "ssss")
|
||||
)
|
||||
autohiss_extra_map = list(
|
||||
"x" = list("ks", "kss", "ksss")
|
||||
)
|
||||
autohiss_exempt = list("Sinta'unathi")
|
||||
|
||||
/datum/species/tajaran
|
||||
autohiss_basic_map = list(
|
||||
"r" = list("rr", "rrr", "rrrr")
|
||||
)
|
||||
autohiss_exempt = list("Siik'tajr")
|
||||
|
||||
/datum/species/plasmaman
|
||||
autohiss_basic_map = list(
|
||||
"s" = list("ss", "sss", "ssss")
|
||||
)
|
||||
|
||||
/datum/species/kidan
|
||||
autohiss_basic_map = list(
|
||||
"z" = list("zz", "zzz", "zzzz"),
|
||||
"v" = list("vv", "vvv", "vvvv")
|
||||
)
|
||||
autohiss_extra_map = list(
|
||||
"s" = list("z", "zs", "zzz", "zzsz")
|
||||
)
|
||||
autohiss_exempt = list("Chittin")
|
||||
|
||||
|
||||
/datum/species/proc/handle_autohiss(message, datum/language/lang, mode)
|
||||
if(!autohiss_basic_map)
|
||||
return message
|
||||
if(autohiss_exempt && (lang.name in autohiss_exempt))
|
||||
return message
|
||||
|
||||
var/map = autohiss_basic_map.Copy()
|
||||
if(mode == AUTOHISS_FULL && autohiss_extra_map)
|
||||
map |= autohiss_extra_map
|
||||
|
||||
. = list()
|
||||
|
||||
while(length(message))
|
||||
var/min_index = 10000 // if the message is longer than this, the autohiss is the least of your problems
|
||||
var/min_char = null
|
||||
for(var/char in map)
|
||||
var/i = findtext(message, char)
|
||||
if(!i) // no more of this character anywhere in the string, don't even bother searching next time
|
||||
map -= char
|
||||
else if(i < min_index)
|
||||
min_index = i
|
||||
min_char = char
|
||||
if(!min_char) // we didn't find any of the mapping characters
|
||||
. += message
|
||||
break
|
||||
. += copytext(message, 1, min_index)
|
||||
if(copytext(message, min_index, min_index+1) == uppertext(min_char))
|
||||
. += capitalize(pick(map[min_char]))
|
||||
else
|
||||
. += pick(map[min_char])
|
||||
message = copytext(message, min_index + 1)
|
||||
|
||||
return list2text(.)
|
||||
|
||||
#undef AUTOHISS_OFF
|
||||
#undef AUTOHISS_BASIC
|
||||
#undef AUTOHISS_FULL
|
||||
#undef AUTOHISS_NUM
|
||||
@@ -143,7 +143,7 @@
|
||||
var/t_state = r_hand.item_state
|
||||
if(!t_state) t_state = r_hand.icon_state
|
||||
r_hand.screen_loc = ui_rhand
|
||||
overlays_standing[X_R_HAND_LAYER] = image("icon" = 'icons/mob/items_righthand.dmi', "icon_state" = t_state)
|
||||
overlays_standing[X_R_HAND_LAYER] = image("icon" = r_hand.righthand_file, "icon_state" = t_state)
|
||||
else
|
||||
overlays_standing[X_R_HAND_LAYER] = null
|
||||
if(update_icons) update_icons()
|
||||
@@ -153,7 +153,7 @@
|
||||
var/t_state = l_hand.item_state
|
||||
if(!t_state) t_state = l_hand.icon_state
|
||||
l_hand.screen_loc = ui_lhand
|
||||
overlays_standing[X_L_HAND_LAYER] = image("icon" = 'icons/mob/items_lefthand.dmi', "icon_state" = t_state)
|
||||
overlays_standing[X_L_HAND_LAYER] = image("icon" = l_hand.lefthand_file, "icon_state" = t_state)
|
||||
else
|
||||
overlays_standing[X_L_HAND_LAYER] = null
|
||||
if(update_icons) update_icons()
|
||||
|
||||
@@ -0,0 +1,128 @@
|
||||
|
||||
var/global/list/body_accessory_by_name = list("None" = null)
|
||||
|
||||
/hook/startup/proc/initalize_body_accessories()
|
||||
|
||||
// __init_body_accessory(/datum/body_accessory/body)
|
||||
__init_body_accessory(/datum/body_accessory/tail)
|
||||
|
||||
if(body_accessory_by_name.len)
|
||||
if(initialize_body_accessory_by_species())
|
||||
return 1
|
||||
|
||||
return 0 //fail if no bodies are found
|
||||
|
||||
var/global/list/body_accessory_by_species = list("None" = null)
|
||||
|
||||
/proc/initialize_body_accessory_by_species()
|
||||
for(var/B in body_accessory_by_name)
|
||||
var/datum/body_accessory/accessory = body_accessory_by_name[B]
|
||||
if(!istype(accessory)) continue
|
||||
|
||||
for(var/species in accessory.allowed_species)
|
||||
if(!body_accessory_by_species["[species]"]) body_accessory_by_species["[species]"] = list()
|
||||
body_accessory_by_species["[species]"] += accessory
|
||||
|
||||
if(body_accessory_by_species.len)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/__init_body_accessory(var/ba_path)
|
||||
if(ispath(ba_path))
|
||||
var/_added_counter = 0
|
||||
|
||||
for(var/A in subtypesof(ba_path))
|
||||
var/datum/body_accessory/B = new A
|
||||
if(istype(B))
|
||||
body_accessory_by_name[B.name] += B
|
||||
++_added_counter
|
||||
|
||||
if(_added_counter)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
/datum/body_accessory
|
||||
var/name = "default"
|
||||
|
||||
var/icon = null
|
||||
var/icon_state = ""
|
||||
|
||||
var/animated_icon = null
|
||||
var/animated_icon_state = ""
|
||||
|
||||
var/blend_mode = null
|
||||
|
||||
var/pixel_x_offset = 0
|
||||
var/pixel_y_offset = 0
|
||||
|
||||
var/list/allowed_species = list()
|
||||
|
||||
/datum/body_accessory/proc/try_restrictions(var/mob/living/carbon/human/H)
|
||||
return 1
|
||||
|
||||
/datum/body_accessory/proc/get_animated_icon() //return animated if it has it, return static if it does not.
|
||||
if(animated_icon)
|
||||
return animated_icon
|
||||
|
||||
else return icon
|
||||
|
||||
/datum/body_accessory/proc/get_animated_icon_state()
|
||||
if(animated_icon_state)
|
||||
return animated_icon_state
|
||||
|
||||
else return icon_state
|
||||
|
||||
/*
|
||||
//Bodies
|
||||
/datum/body_accessory/body
|
||||
blend_mode = ICON_MULTIPLY
|
||||
|
||||
/datum/body_accessory/body/snake
|
||||
name = "Snake"
|
||||
|
||||
icon = 'icons/mob/body_accessory_64.dmi'
|
||||
icon_state = "naga"
|
||||
|
||||
pixel_x_offset = -16*/
|
||||
|
||||
//Tails
|
||||
/datum/body_accessory/tail
|
||||
icon = 'icons/mob/body_accessory.dmi'
|
||||
animated_icon = 'icons/mob/body_accessory.dmi'
|
||||
blend_mode = ICON_ADD
|
||||
|
||||
/datum/body_accessory/tail/try_restrictions(var/mob/living/carbon/human/H)
|
||||
if(!H.wear_suit || !(H.wear_suit.flags_inv & HIDETAIL) && !istype(H.wear_suit, /obj/item/clothing/suit/space))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
//vulpakin
|
||||
/datum/body_accessory/tail/vulpkanin_2
|
||||
name = "Vulpkanin Alt 1 (Bushy)"
|
||||
|
||||
icon_state = "vulptail2"
|
||||
animated_icon_state = "vulptail2_a"
|
||||
allowed_species = list("Vulpkanin")
|
||||
|
||||
/datum/body_accessory/tail/vulpkanin_3
|
||||
name = "Vulpkanin Alt 2 (Straight)"
|
||||
|
||||
icon_state = "vulptail3"
|
||||
animated_icon_state = "vulptail3_a"
|
||||
allowed_species = list("Vulpkanin")
|
||||
|
||||
/datum/body_accessory/tail/vulpkanin_4
|
||||
name = "Vulpkanin Alt 3 (Tiny)"
|
||||
|
||||
icon_state = "vulptail4"
|
||||
animated_icon_state = "vulptail4_a"
|
||||
allowed_species = list("Vulpkanin")
|
||||
|
||||
/datum/body_accessory/tail/vulpkanin_5
|
||||
name = "Vulpkanin Alt 4 (Short)"
|
||||
|
||||
icon_state = "vulptail5"
|
||||
animated_icon_state = "vulptail5_a"
|
||||
allowed_species = list("Vulpkanin")
|
||||
@@ -116,7 +116,12 @@
|
||||
m_type = 1
|
||||
|
||||
if("wag")
|
||||
if(species.bodyflags & TAIL_WAGGING)
|
||||
if(body_accessory)
|
||||
if(body_accessory.try_restrictions(src))
|
||||
message = "<B>[src]</B> starts wagging \his tail."
|
||||
start_tail_wagging(1)
|
||||
|
||||
else if(species.bodyflags & TAIL_WAGGING)
|
||||
if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space))
|
||||
message = "<B>[src]</B> starts wagging \his tail."
|
||||
src.start_tail_wagging(1)
|
||||
@@ -126,7 +131,7 @@
|
||||
return
|
||||
|
||||
if("swag")
|
||||
if(species.bodyflags & TAIL_WAGGING)
|
||||
if(species.bodyflags & TAIL_WAGGING || body_accessory)
|
||||
message = "<B>[src]</B> stops wagging \his tail."
|
||||
src.stop_tail_wagging(1)
|
||||
else
|
||||
|
||||
@@ -1779,4 +1779,9 @@
|
||||
if(I.body_parts_covered & HEAD)
|
||||
prot["head"] = max(1 - I.permeability_coefficient, prot["head"])
|
||||
var/protection = (prot["head"] + prot["arms"] + prot["feet"] + prot["legs"] + prot["groin"] + prot["chest"] + prot["hands"])/7
|
||||
return protection
|
||||
return protection
|
||||
|
||||
/mob/living/carbon/human/proc/get_full_print()
|
||||
if(!dna || !dna.uni_identity)
|
||||
return
|
||||
return md5(dna.uni_identity)
|
||||
@@ -82,4 +82,6 @@
|
||||
var/lastFart = 0 // Toxic fart cooldown.
|
||||
|
||||
var/fire_dmi = 'icons/mob/OnFire.dmi'
|
||||
var/fire_sprite = "Standing"
|
||||
var/fire_sprite = "Standing"
|
||||
|
||||
var/datum/body_accessory/body_accessory = null
|
||||
|
||||
@@ -1,152 +1,10 @@
|
||||
/mob/living/carbon/human/say(var/message)
|
||||
|
||||
var/verb = "says"
|
||||
var/alt_name = ""
|
||||
var/message_range = world.view
|
||||
var/italics = 0
|
||||
|
||||
if(client)
|
||||
if(client.prefs.muted & MUTE_IC)
|
||||
src << "\red You cannot speak in IC (Muted)."
|
||||
return
|
||||
|
||||
message = trim_strip_html_properly(message)
|
||||
|
||||
if(stat)
|
||||
if(stat == 2)
|
||||
return say_dead(message)
|
||||
return
|
||||
|
||||
if (is_muzzled())
|
||||
src << "<span class='danger'>You're muzzled and cannot speak!</span>"
|
||||
return
|
||||
|
||||
var/message_mode = parse_message_mode(message, "headset")
|
||||
|
||||
if(copytext(message,1,2) == "*")
|
||||
return emote(copytext(message,2))
|
||||
|
||||
if(name != GetVoice())
|
||||
alt_name = " (as [get_id_name("Unknown")])"
|
||||
|
||||
//parse the radio code and consume it
|
||||
if (message_mode)
|
||||
if (message_mode == "headset")
|
||||
message = copytext(message,2) //it would be really nice if the parse procs could do this for us.
|
||||
else
|
||||
message = copytext(message,3)
|
||||
|
||||
//parse the language code and consume it
|
||||
var/datum/language/speaking = parse_language(message)
|
||||
if(speaking)
|
||||
message = copytext(message,2+length(speaking.key))
|
||||
else
|
||||
speaking = get_default_language()
|
||||
|
||||
var/ending = copytext(message, length(message))
|
||||
if (speaking)
|
||||
// This is broadcast to all mobs with the language,
|
||||
// irrespective of distance or anything else.
|
||||
if(speaking.flags & HIVEMIND)
|
||||
speaking.broadcast(src,trim(message))
|
||||
return
|
||||
//If we've gotten this far, keep going!
|
||||
verb = speaking.get_spoken_verb(ending)
|
||||
else
|
||||
if(ending=="!")
|
||||
verb=pick("exclaims","shouts","yells")
|
||||
if(ending=="?")
|
||||
verb="asks"
|
||||
|
||||
message = trim(message)
|
||||
|
||||
if(speech_problem_flag)
|
||||
var/list/handle_r = handle_speech_problems(message)
|
||||
message = handle_r[1]
|
||||
verb = handle_r[2]
|
||||
speech_problem_flag = handle_r[3]
|
||||
|
||||
if(!message || message == "")
|
||||
return
|
||||
|
||||
var/list/obj/item/used_radios = new
|
||||
|
||||
switch (message_mode)
|
||||
if("headset")
|
||||
if(l_ear && istype(l_ear,/obj/item/device/radio))
|
||||
var/obj/item/device/radio/R = l_ear
|
||||
R.talk_into(src,message,null,verb,speaking)
|
||||
used_radios += l_ear
|
||||
else if(r_ear && istype(r_ear,/obj/item/device/radio))
|
||||
var/obj/item/device/radio/R = r_ear
|
||||
R.talk_into(src,message,null,verb,speaking)
|
||||
used_radios += r_ear
|
||||
|
||||
if("right ear")
|
||||
var/obj/item/device/radio/R
|
||||
var/has_radio = 0
|
||||
if(r_ear && istype(r_ear,/obj/item/device/radio))
|
||||
R = r_ear
|
||||
has_radio = 1
|
||||
if(r_hand && istype(r_hand, /obj/item/device/radio))
|
||||
R = r_hand
|
||||
has_radio = 1
|
||||
if(has_radio)
|
||||
R.talk_into(src,message,null,verb,speaking)
|
||||
used_radios += R
|
||||
|
||||
|
||||
if("left ear")
|
||||
var/obj/item/device/radio/R
|
||||
var/has_radio = 0
|
||||
if(l_ear && istype(l_ear,/obj/item/device/radio))
|
||||
R = l_ear
|
||||
has_radio = 1
|
||||
if(l_hand && istype(l_hand,/obj/item/device/radio))
|
||||
R = l_hand
|
||||
has_radio = 1
|
||||
if(has_radio)
|
||||
R.talk_into(src,message,null,verb,speaking)
|
||||
used_radios += R
|
||||
|
||||
if("intercom")
|
||||
for(var/obj/item/device/radio/intercom/I in view(1, null))
|
||||
I.talk_into(src, message, verb, speaking)
|
||||
used_radios += I
|
||||
if("whisper")
|
||||
whisper_say(message, speaking, alt_name)
|
||||
return
|
||||
else
|
||||
if(message_mode)
|
||||
if(l_ear && istype(l_ear,/obj/item/device/radio))
|
||||
l_ear.talk_into(src,message, message_mode, verb, speaking)
|
||||
used_radios += l_ear
|
||||
else if(r_ear && istype(r_ear,/obj/item/device/radio))
|
||||
r_ear.talk_into(src,message, message_mode, verb, speaking)
|
||||
used_radios += r_ear
|
||||
|
||||
var/sound/speech_sound
|
||||
var/sound_vol
|
||||
if(species.speech_sounds && prob(species.speech_chance))
|
||||
speech_sound = sound(pick(species.speech_sounds))
|
||||
sound_vol = 50
|
||||
|
||||
//speaking into radios
|
||||
if(used_radios.len)
|
||||
italics = 1
|
||||
message_range = 1
|
||||
if(speaking)
|
||||
message_range = speaking.get_talkinto_msg_range(message)
|
||||
var/msg
|
||||
if(!speaking || !(speaking.flags & NO_TALK_MSG))
|
||||
msg = "<span class='notice'>\The [src] talks into \the [used_radios[1]]</span>"
|
||||
for(var/mob/living/M in hearers(5, src))
|
||||
if((M != src) && msg)
|
||||
M.show_message(msg)
|
||||
if (speech_sound)
|
||||
sound_vol *= 0.5
|
||||
|
||||
..(message, speaking, verb, alt_name, italics, message_range, speech_sound, sound_vol) //ohgod we should really be passing a datum here.
|
||||
..(message, alt_name = alt_name) //ohgod we should really be passing a datum here.
|
||||
|
||||
/mob/living/carbon/human/proc/forcesay(list/append)
|
||||
if(stat == CONSCIOUS)
|
||||
@@ -207,7 +65,7 @@
|
||||
// return 0
|
||||
|
||||
return ..()
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/HasVoiceChanger()
|
||||
for(var/obj/item/gear in list(wear_mask,wear_suit,head))
|
||||
if(!gear)
|
||||
@@ -216,7 +74,7 @@
|
||||
if(changer && changer.active && changer.voice)
|
||||
return changer.voice
|
||||
return 0
|
||||
|
||||
|
||||
/mob/living/carbon/human/GetVoice()
|
||||
var/has_changer = HasVoiceChanger()
|
||||
if(has_changer)
|
||||
@@ -240,15 +98,6 @@
|
||||
return special_voice
|
||||
|
||||
|
||||
/*
|
||||
***Deprecated***
|
||||
let this be handled at the hear_say or hear_radio proc
|
||||
This is left in for robot speaking when humans gain binary channel access until I get around to rewriting
|
||||
robot_talk() proc.
|
||||
There is no language handling build into it however there is at the /mob level so we accept the call
|
||||
for it but just ignore it.
|
||||
*/
|
||||
|
||||
/mob/living/carbon/human/say_quote(var/message, var/datum/language/speaking = null)
|
||||
var/verb = "says"
|
||||
var/ending = copytext(message, length(message))
|
||||
@@ -257,27 +106,27 @@
|
||||
verb = speaking.get_spoken_verb(ending)
|
||||
else
|
||||
if(ending == "!")
|
||||
verb = "exclaims"
|
||||
else if(ending == "?")
|
||||
verb = "asks"
|
||||
return pick("exclaims", "shouts", "yells")
|
||||
if(ending == "?")
|
||||
return "asks"
|
||||
|
||||
return verb
|
||||
|
||||
/mob/living/carbon/human/proc/handle_speech_problems(var/message)
|
||||
|
||||
/mob/living/carbon/human/handle_speech_problems(var/message, var/verb)
|
||||
var/list/returns[3]
|
||||
var/verb = "says"
|
||||
var/handled = 0
|
||||
var/speech_problem_flag = 0
|
||||
|
||||
if(silent || (sdisabilities & MUTE))
|
||||
message = ""
|
||||
handled = 1
|
||||
speech_problem_flag = 1
|
||||
|
||||
if(istype(wear_mask, /obj/item/clothing/mask/horsehead))
|
||||
var/obj/item/clothing/mask/horsehead/hoers = wear_mask
|
||||
if(hoers.voicechange)
|
||||
if(mind && mind.changeling && department_radio_keys[copytext(message, 1, 3)] != "changeling")
|
||||
message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
|
||||
verb = pick("whinnies","neighs", "says")
|
||||
handled = 1
|
||||
message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
|
||||
verb = pick("whinnies","neighs", "says")
|
||||
speech_problem_flag = 1
|
||||
|
||||
if(dna)
|
||||
for(var/datum/dna/gene/gene in dna_genes)
|
||||
@@ -285,25 +134,18 @@
|
||||
continue
|
||||
if(gene.is_active(src))
|
||||
message = gene.OnSay(src,message)
|
||||
handled = 1
|
||||
speech_problem_flag = 1
|
||||
|
||||
if(message != "")
|
||||
if((HULK in mutations) && health >= 25 && length(message))
|
||||
message = "[uppertext(message)]!!!"
|
||||
verb = pick("yells","roars","hollers")
|
||||
handled = 1
|
||||
if(slurring)
|
||||
message = slur(message)
|
||||
verb = "slurs"
|
||||
handled = 1
|
||||
if(stuttering)
|
||||
message = stutter(message)
|
||||
verb = "stammers"
|
||||
handled = 1
|
||||
var/list/parent = ..()
|
||||
message = parent[1]
|
||||
verb = parent[2]
|
||||
if(parent[3])
|
||||
speech_problem_flag = 1
|
||||
|
||||
var/braindam = getBrainLoss()
|
||||
if(braindam >= 60)
|
||||
handled = 1
|
||||
speech_problem_flag = 1
|
||||
if(prob(braindam/4))
|
||||
message = stutter(message)
|
||||
verb = "gibbers"
|
||||
@@ -311,9 +153,70 @@
|
||||
message = uppertext(message)
|
||||
verb = "yells loudly"
|
||||
|
||||
if(COMIC in mutations)
|
||||
message = "<span class='sans'>[message]</span>"
|
||||
returns[1] = message
|
||||
returns[2] = verb
|
||||
returns[3] = handled
|
||||
returns[3] = speech_problem_flag
|
||||
return returns
|
||||
|
||||
/mob/living/carbon/human/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios, var/alt_name)
|
||||
switch(message_mode)
|
||||
if("intercom")
|
||||
for(var/obj/item/device/radio/intercom/I in view(1, null))
|
||||
I.talk_into(src, message, verb, speaking)
|
||||
used_radios += I
|
||||
|
||||
if("headset")
|
||||
if(l_ear && istype(l_ear,/obj/item/device/radio))
|
||||
var/obj/item/device/radio/R = l_ear
|
||||
R.talk_into(src,message,null,verb,speaking)
|
||||
used_radios += l_ear
|
||||
else if(r_ear && istype(r_ear,/obj/item/device/radio))
|
||||
var/obj/item/device/radio/R = r_ear
|
||||
R.talk_into(src,message,null,verb,speaking)
|
||||
used_radios += r_ear
|
||||
|
||||
if("right ear")
|
||||
var/obj/item/device/radio/R
|
||||
var/has_radio = 0
|
||||
if(r_ear && istype(r_ear,/obj/item/device/radio))
|
||||
R = r_ear
|
||||
has_radio = 1
|
||||
if(r_hand && istype(r_hand, /obj/item/device/radio))
|
||||
R = r_hand
|
||||
has_radio = 1
|
||||
if(has_radio)
|
||||
R.talk_into(src,message,null,verb,speaking)
|
||||
used_radios += R
|
||||
|
||||
|
||||
if("left ear")
|
||||
var/obj/item/device/radio/R
|
||||
var/has_radio = 0
|
||||
if(l_ear && istype(l_ear,/obj/item/device/radio))
|
||||
R = l_ear
|
||||
has_radio = 1
|
||||
if(l_hand && istype(l_hand,/obj/item/device/radio))
|
||||
R = l_hand
|
||||
has_radio = 1
|
||||
if(has_radio)
|
||||
R.talk_into(src,message,null,verb,speaking)
|
||||
used_radios += R
|
||||
|
||||
if("whisper")
|
||||
whisper_say(message, speaking, alt_name)
|
||||
return 1
|
||||
else
|
||||
if(message_mode)
|
||||
if(l_ear && istype(l_ear,/obj/item/device/radio))
|
||||
l_ear.talk_into(src,message, message_mode, verb, speaking)
|
||||
used_radios += l_ear
|
||||
else if(r_ear && istype(r_ear,/obj/item/device/radio))
|
||||
r_ear.talk_into(src,message, message_mode, verb, speaking)
|
||||
used_radios += r_ear
|
||||
|
||||
/mob/living/carbon/human/handle_speech_sound()
|
||||
var/list/returns[2]
|
||||
if(species.speech_sounds && prob(species.speech_chance))
|
||||
returns[1] = sound(pick(species.speech_sounds))
|
||||
returns[2] = 50
|
||||
return returns
|
||||
@@ -35,7 +35,8 @@
|
||||
"antennae" = /obj/item/organ/wryn/hivenode
|
||||
)
|
||||
|
||||
flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | NO_BREATHE | HAS_SKIN_COLOR | NO_SCAN | NO_SCAN | HIVEMIND
|
||||
flags = IS_WHITELISTED | HAS_LIPS | NO_BREATHE | HAS_SKIN_COLOR | NO_SCAN | NO_SCAN | HIVEMIND
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
dietflags = DIET_HERB //bees feed off nectar, so bee people feed off plants too
|
||||
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
@@ -61,6 +61,7 @@
|
||||
var/has_fine_manipulation = 1 // Can use small items.
|
||||
|
||||
var/flags = 0 // Various specific features.
|
||||
var/clothing_flags = 0 // Underwear and socks.
|
||||
var/bloodflags = 0
|
||||
var/bodyflags = 0
|
||||
var/dietflags = 0 // Make sure you set this, otherwise it won't be able to digest a lot of foods
|
||||
|
||||
@@ -6,7 +6,8 @@
|
||||
primitive_form = "Monkey"
|
||||
path = /mob/living/carbon/human/human
|
||||
language = "Sol Common"
|
||||
flags = HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT
|
||||
flags = HAS_LIPS | CAN_BE_FAT
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
bodyflags = HAS_SKIN_TONE
|
||||
dietflags = DIET_OMNI
|
||||
unarmed_type = /datum/unarmed_attack/punch
|
||||
@@ -37,7 +38,8 @@
|
||||
else, frequently even their own lives. They prefer warmer temperatures than most species and \
|
||||
their native tongue is a heavy hissing laungage called Sinta'Unathi."
|
||||
|
||||
flags = HAS_LIPS | HAS_UNDERWEAR
|
||||
flags = HAS_LIPS
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
bodyflags = FEET_CLAWS | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING
|
||||
dietflags = DIET_CARN
|
||||
|
||||
@@ -88,7 +90,8 @@
|
||||
|
||||
primitive_form = "Farwa"
|
||||
|
||||
flags = HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT
|
||||
flags = HAS_LIPS | CAN_BE_FAT
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING
|
||||
dietflags = DIET_OMNI
|
||||
|
||||
@@ -119,7 +122,8 @@
|
||||
to the degree it can cause conflict with more rigorous and strict authorities. They speak a guttural language known as 'Canilunzt' \
|
||||
which has a heavy emphasis on utilizing tail positioning and ear twitches to communicate intent."
|
||||
|
||||
flags = HAS_LIPS | HAS_UNDERWEAR
|
||||
flags = HAS_LIPS
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING
|
||||
dietflags = DIET_OMNI
|
||||
|
||||
@@ -148,7 +152,8 @@
|
||||
herbivores on the whole and tend to be co-operative with the other species of the galaxy, although they rarely reveal \
|
||||
the secrets of their empire to their allies."
|
||||
|
||||
flags = HAS_LIPS | HAS_UNDERWEAR
|
||||
flags = HAS_LIPS
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
bodyflags = HAS_SKIN_COLOR
|
||||
dietflags = DIET_HERB
|
||||
|
||||
@@ -190,6 +195,7 @@
|
||||
poison_type = "oxygen"
|
||||
|
||||
flags = NO_SCAN | IS_WHITELISTED
|
||||
clothing_flags = HAS_SOCKS
|
||||
dietflags = DIET_OMNI
|
||||
|
||||
blood_color = "#2299FC"
|
||||
@@ -278,6 +284,7 @@
|
||||
brute_mod = 0.8
|
||||
|
||||
flags = IS_WHITELISTED
|
||||
clothing_flags = HAS_SOCKS
|
||||
bodyflags = FEET_CLAWS
|
||||
dietflags = DIET_HERB
|
||||
|
||||
@@ -295,6 +302,7 @@
|
||||
unarmed_type = /datum/unarmed_attack/punch
|
||||
|
||||
flags = IS_WHITELISTED | NO_BREATHE | HAS_LIPS | NO_INTORGANS | NO_SCAN
|
||||
clothing_flags = HAS_SOCKS
|
||||
bodyflags = HAS_SKIN_COLOR
|
||||
bloodflags = BLOOD_SLIME
|
||||
dietflags = DIET_CARN
|
||||
@@ -322,7 +330,8 @@
|
||||
default_genes = list(REMOTE_TALK)
|
||||
|
||||
|
||||
flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT
|
||||
flags = IS_WHITELISTED | HAS_LIPS | CAN_BE_FAT
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
dietflags = DIET_HERB
|
||||
|
||||
reagent_tag = PROCESS_ORG
|
||||
@@ -373,6 +382,7 @@
|
||||
water and other radiation."
|
||||
|
||||
flags = NO_BREATHE | REQUIRE_LIGHT | IS_PLANT | RAD_ABSORB | NO_BLOOD | NO_PAIN
|
||||
clothing_flags = HAS_SOCKS
|
||||
dietflags = 0 //Diona regenerate nutrition in light, no diet necessary
|
||||
|
||||
body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not
|
||||
@@ -467,6 +477,7 @@
|
||||
passive_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment.
|
||||
|
||||
flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA_RAD
|
||||
clothing_flags = HAS_SOCKS
|
||||
dietflags = 0 //IPCs can't eat, so no diet
|
||||
blood_color = "#1F181F"
|
||||
flesh_color = "#AAAAAA"
|
||||
|
||||
@@ -317,18 +317,18 @@ var/global/list/damage_icon_parts = list()
|
||||
stand_icon.Blend(base_icon,ICON_OVERLAY)
|
||||
|
||||
//Underwear
|
||||
if(underwear && species.flags & HAS_UNDERWEAR)
|
||||
if(underwear && species.clothing_flags & HAS_UNDERWEAR)
|
||||
var/datum/sprite_accessory/underwear/U = underwear_list[underwear]
|
||||
if(U)
|
||||
stand_icon.Blend(new /icon(U.icon, "uw_[U.icon_state]_s"), ICON_OVERLAY)
|
||||
|
||||
if(undershirt && species.flags & HAS_UNDERWEAR)
|
||||
if(undershirt && species.clothing_flags & HAS_UNDERSHIRT)
|
||||
var/datum/sprite_accessory/undershirt/U2 = undershirt_list[undershirt]
|
||||
if(U2)
|
||||
stand_icon.Blend(new /icon(U2.icon, "us_[U2.icon_state]_s"), ICON_OVERLAY)
|
||||
|
||||
|
||||
if(socks)
|
||||
if(socks && species.clothing_flags & HAS_SOCKS)
|
||||
var/datum/sprite_accessory/socks/U3 = socks_list[socks]
|
||||
if(U3)
|
||||
stand_icon.Blend(new /icon(U3.icon, "sk_[U3.icon_state]_s"), ICON_OVERLAY)
|
||||
@@ -344,7 +344,7 @@ var/global/list/damage_icon_parts = list()
|
||||
stand_icon.Blend(lips, ICON_OVERLAY)
|
||||
|
||||
//tail
|
||||
update_tail_showing(0)
|
||||
update_tail_layer(0)
|
||||
|
||||
|
||||
//HAIR OVERLAY
|
||||
@@ -763,12 +763,12 @@ var/global/list/damage_icon_parts = list()
|
||||
|
||||
overlays_standing[SUIT_LAYER] = standing
|
||||
|
||||
update_tail_showing(0)
|
||||
update_tail_layer(0)
|
||||
|
||||
else
|
||||
overlays_standing[SUIT_LAYER] = null
|
||||
|
||||
update_tail_showing(0)
|
||||
update_tail_layer(0)
|
||||
|
||||
update_collar(0)
|
||||
|
||||
@@ -868,15 +868,10 @@ var/global/list/damage_icon_parts = list()
|
||||
var/t_state = r_hand.item_state
|
||||
if(!t_state) t_state = r_hand.icon_state
|
||||
|
||||
if(r_hand.icon_override)
|
||||
t_state = "[t_state]_r"
|
||||
overlays_standing[R_HAND_LAYER] = image("icon" = r_hand.icon_override, "icon_state" = "[t_state]")
|
||||
else if(r_hand.sprite_sheets && r_hand.sprite_sheets[species.name])
|
||||
t_state = "[t_state]_r"
|
||||
overlays_standing[R_HAND_LAYER] = image("icon" = r_hand.sprite_sheets[species.name], "icon_state" = "[t_state]")
|
||||
else
|
||||
overlays_standing[R_HAND_LAYER] = image("icon" = 'icons/mob/items_righthand.dmi', "icon_state" = "[t_state]")
|
||||
|
||||
var/image/I = image("icon" = r_hand.righthand_file, "icon_state"="[t_state]", "layer"=-R_HAND_LAYER)
|
||||
I = center_image(I, r_hand.inhand_x_dimension, r_hand.inhand_y_dimension)
|
||||
overlays_standing[R_HAND_LAYER] = I
|
||||
|
||||
if (handcuffed) drop_r_hand()
|
||||
else
|
||||
overlays_standing[R_HAND_LAYER] = null
|
||||
@@ -889,24 +884,29 @@ var/global/list/damage_icon_parts = list()
|
||||
var/t_state = l_hand.item_state
|
||||
if(!t_state) t_state = l_hand.icon_state
|
||||
|
||||
if(l_hand.icon_override)
|
||||
t_state = "[t_state]_l"
|
||||
overlays_standing[L_HAND_LAYER] = image("icon" = l_hand.icon_override, "icon_state" = "[t_state]")
|
||||
else if(l_hand.sprite_sheets && l_hand.sprite_sheets[species.name])
|
||||
t_state = "[t_state]_l"
|
||||
overlays_standing[L_HAND_LAYER] = image("icon" = l_hand.sprite_sheets[species.name], "icon_state" = "[t_state]")
|
||||
else
|
||||
overlays_standing[L_HAND_LAYER] = image("icon" = 'icons/mob/items_lefthand.dmi', "icon_state" = "[t_state]")
|
||||
var/image/I = image("icon" = l_hand.lefthand_file, "icon_state"="[t_state]", "layer"=-L_HAND_LAYER)
|
||||
I = center_image(I, l_hand.inhand_x_dimension, l_hand.inhand_y_dimension)
|
||||
overlays_standing[L_HAND_LAYER] = I
|
||||
|
||||
if (handcuffed) drop_l_hand()
|
||||
else
|
||||
overlays_standing[L_HAND_LAYER] = null
|
||||
if(update_icons) update_icons()
|
||||
|
||||
/mob/living/carbon/human/proc/update_tail_showing(var/update_icons=1)
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/update_tail_layer(var/update_icons=1)
|
||||
overlays_standing[TAIL_LAYER] = null
|
||||
|
||||
if(species.tail && species.bodyflags & HAS_TAIL)
|
||||
if(body_accessory)
|
||||
if(body_accessory.try_restrictions(src))
|
||||
var/icon/accessory_s = new/icon("icon" = body_accessory.icon, "icon_state" = body_accessory.icon_state)
|
||||
accessory_s.Blend(rgb(r_skin, g_skin, b_skin), body_accessory.blend_mode)
|
||||
|
||||
overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
|
||||
|
||||
|
||||
else if(species.tail && species.bodyflags & HAS_TAIL) //no tailless tajaran
|
||||
if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space))
|
||||
var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_s")
|
||||
tail_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
|
||||
@@ -920,7 +920,13 @@ var/global/list/damage_icon_parts = list()
|
||||
/mob/living/carbon/human/proc/start_tail_wagging(var/update_icons=1)
|
||||
overlays_standing[TAIL_LAYER] = null
|
||||
|
||||
if(species.tail && species.bodyflags & HAS_TAIL)
|
||||
if(body_accessory)
|
||||
var/icon/accessory_s = new/icon("icon" = body_accessory.get_animated_icon(), "icon_state" = body_accessory.get_animated_icon_state())
|
||||
accessory_s.Blend(rgb(r_skin, g_skin, b_skin), body_accessory.blend_mode)
|
||||
|
||||
overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
|
||||
|
||||
else if(species.tail && species.bodyflags & HAS_TAIL)
|
||||
var/icon/tailw_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]w_s")
|
||||
tailw_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
|
||||
|
||||
@@ -932,14 +938,11 @@ var/global/list/damage_icon_parts = list()
|
||||
/mob/living/carbon/human/proc/stop_tail_wagging(var/update_icons=1)
|
||||
overlays_standing[TAIL_LAYER] = null
|
||||
|
||||
if(species.tail && species.bodyflags & HAS_TAIL)
|
||||
var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_s")
|
||||
tail_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
|
||||
update_tail_layer(update_icons) //just trigger a full update for normal stationary sprites
|
||||
|
||||
overlays_standing[TAIL_LAYER] = image(tail_s)
|
||||
|
||||
if(update_icons)
|
||||
update_icons()
|
||||
/mob/living/carbon/human/handle_transform_change()
|
||||
..()
|
||||
update_tail_layer()
|
||||
|
||||
//Adds a collar overlay above the helmet layer if the suit has one
|
||||
// Suit needs an identically named sprite in icons/mob/collar.dmi
|
||||
|
||||
@@ -141,26 +141,26 @@
|
||||
loc_temp = loc:air_contents.temperature
|
||||
else
|
||||
loc_temp = environment.temperature
|
||||
|
||||
if(loc_temp < 310.15) // a cold place
|
||||
bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1)
|
||||
else // a hot place
|
||||
bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1)
|
||||
|
||||
|
||||
//Account for massive pressure differences
|
||||
|
||||
if(bodytemperature < (T0C + 5)) // start calculating temperature damage etc
|
||||
if(bodytemperature <= (T0C - 40)) // stun temperature
|
||||
Tempstun = 1
|
||||
|
||||
if(bodytemperature <= (T0C - 50)) // hurt temperature
|
||||
if(bodytemperature <= 50) // sqrting negative numbers is bad
|
||||
adjustToxLoss(200)
|
||||
else
|
||||
adjustToxLoss(301) //The config.health_threshold_dead is -100 by default, and slimes have 150hp (200hp for adults),
|
||||
else //so the ToxLoss needs to be 300 or above to guarrantee an instant death
|
||||
adjustToxLoss(round(sqrt(bodytemperature)) * 2)
|
||||
|
||||
else
|
||||
Tempstun = 0
|
||||
|
||||
|
||||
/*moved after the temperature damage code so freeze beams can instantly kill slimes -Deity Link*/
|
||||
if(loc_temp < 310.15) // a cold place
|
||||
bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1)
|
||||
else // a hot place
|
||||
bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1)
|
||||
|
||||
updatehealth()
|
||||
|
||||
@@ -215,7 +215,7 @@
|
||||
if(src.stat != DEAD)
|
||||
src.stat = UNCONSCIOUS
|
||||
|
||||
if(prob(30))
|
||||
if(prob(30)) //I think this is meant to allow slimes to starve to death
|
||||
adjustOxyLoss(-1)
|
||||
adjustToxLoss(-1)
|
||||
adjustFireLoss(-1)
|
||||
|
||||
@@ -28,4 +28,8 @@
|
||||
|
||||
if(changed)
|
||||
animate(src, transform = ntransform, time = 2, pixel_y = final_pixel_y, dir = final_dir, easing = EASE_IN|EASE_OUT)
|
||||
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart it in next life().
|
||||
handle_transform_change()
|
||||
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart it in next life().
|
||||
|
||||
/mob/living/carbon/proc/handle_transform_change()
|
||||
return
|
||||
@@ -67,7 +67,125 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
/mob/living/proc/get_default_language()
|
||||
return default_language
|
||||
|
||||
/mob/living/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/italics=0, var/message_range = world.view, var/sound/speech_sound, var/sound_vol)
|
||||
/mob/living/proc/handle_speech_problems(var/message, var/verb)
|
||||
var/list/returns[3]
|
||||
var/speech_problem_flag = 0
|
||||
|
||||
if((HULK in mutations) && health >= 25 && length(message))
|
||||
message = "[uppertext(message)]!!!"
|
||||
verb = pick("yells","roars","hollers")
|
||||
speech_problem_flag = 1
|
||||
|
||||
if(COMIC in mutations)
|
||||
message = "<span class='sans'>[message]</span>"
|
||||
|
||||
if(slurring)
|
||||
message = slur(message)
|
||||
verb = "slurs"
|
||||
speech_problem_flag = 1
|
||||
if(stuttering)
|
||||
message = stutter(message)
|
||||
verb = "stammers"
|
||||
speech_problem_flag = 1
|
||||
|
||||
returns[1] = message
|
||||
returns[2] = verb
|
||||
returns[3] = speech_problem_flag
|
||||
return returns
|
||||
|
||||
/mob/living/proc/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)
|
||||
return 0
|
||||
|
||||
/mob/living/proc/handle_speech_sound()
|
||||
var/list/returns[2]
|
||||
returns[1] = null
|
||||
returns[2] = null
|
||||
return returns
|
||||
|
||||
|
||||
/mob/living/say(var/message, var/datum/language/speaking = null, var/verb = "says", var/alt_name="")
|
||||
if(client)
|
||||
if(client.prefs.muted & MUTE_IC)
|
||||
src << "\red You cannot speak in IC (Muted)."
|
||||
return
|
||||
|
||||
message = trim_strip_html_properly(message)
|
||||
|
||||
if(stat)
|
||||
if(stat == 2)
|
||||
return say_dead(message)
|
||||
return
|
||||
|
||||
var/message_mode = parse_message_mode(message, "headset")
|
||||
|
||||
if(copytext(message,1,2) == "*")
|
||||
return emote(copytext(message,2))
|
||||
|
||||
//parse the radio code and consume it
|
||||
if (message_mode)
|
||||
if (message_mode == "headset")
|
||||
message = copytext(message,2) //it would be really nice if the parse procs could do this for us.
|
||||
else
|
||||
message = copytext(message,3)
|
||||
|
||||
message = trim_left(message)
|
||||
|
||||
//parse the language code and consume it
|
||||
if(!speaking)
|
||||
speaking = parse_language(message)
|
||||
if(speaking)
|
||||
message = copytext(message, 2 + length(speaking.key))
|
||||
else
|
||||
speaking = get_default_language()
|
||||
|
||||
// This is broadcast to all mobs with the language,
|
||||
// irrespective of distance or anything else.
|
||||
if(speaking && (speaking.flags & HIVEMIND))
|
||||
speaking.broadcast(src,trim(message))
|
||||
return 1
|
||||
|
||||
verb = say_quote(message, speaking)
|
||||
|
||||
if(is_muzzled())
|
||||
src << "<span class='danger'>You're muzzled and cannot speak!</span>"
|
||||
return
|
||||
|
||||
message = trim_left(message)
|
||||
|
||||
message = handle_autohiss(message, speaking)
|
||||
|
||||
var/list/handle_s = handle_speech_problems(message, verb)
|
||||
message = handle_s[1]
|
||||
verb = handle_s[2]
|
||||
|
||||
if(!message || message == "")
|
||||
return 0
|
||||
|
||||
var/list/obj/item/used_radios = new
|
||||
if(handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name))
|
||||
return 1
|
||||
|
||||
var/list/handle_v = handle_speech_sound()
|
||||
var/sound/speech_sound = handle_v[1]
|
||||
var/sound_vol = handle_v[2]
|
||||
|
||||
var/italics = 0
|
||||
var/message_range = world.view
|
||||
|
||||
//speaking into radios
|
||||
if(used_radios.len)
|
||||
italics = 1
|
||||
message_range = 1
|
||||
if(speaking)
|
||||
message_range = speaking.get_talkinto_msg_range(message)
|
||||
var/msg
|
||||
if(!speaking || !(speaking.flags & NO_TALK_MSG))
|
||||
msg = "<span class='notice'>\The [src] talks into \the [used_radios[1]]</span>"
|
||||
for(var/mob/living/M in hearers(5, src))
|
||||
if((M != src) && msg)
|
||||
M.show_message(msg)
|
||||
if (speech_sound)
|
||||
sound_vol *= 0.5
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
|
||||
|
||||
@@ -538,7 +538,6 @@
|
||||
return
|
||||
H.icon_state = "pai-[icon_state]"
|
||||
H.item_state = "pai-[icon_state]"
|
||||
H.icon_override = 'icons/mob/in-hand/paiheld.dmi'//I have these in diffrent DMI so i am overriding
|
||||
grabber.put_in_active_hand(H)//for some reason unless i call this it dosen't work
|
||||
grabber.update_inv_l_hand()
|
||||
grabber.update_inv_r_hand()
|
||||
@@ -546,13 +545,22 @@
|
||||
return H
|
||||
|
||||
/mob/living/silicon/pai/MouseDrop(atom/over_object)
|
||||
var/mob/living/carbon/H = over_object
|
||||
if(!istype(H) || !Adjacent(H)) return ..()
|
||||
if(H.a_intent == I_HELP)
|
||||
get_scooped(H)
|
||||
//return
|
||||
var/mob/living/carbon/human/H = over_object //changed to human to avoid stupid issues like xenos holding pAIs.
|
||||
if(!istype(H) || !Adjacent(H)) return ..()
|
||||
if(usr == src)
|
||||
switch(alert(H, "[src] wants you to pick them up. Do it?",,"Yes","No"))
|
||||
if("Yes")
|
||||
if(Adjacent(H))
|
||||
get_scooped(H)
|
||||
else
|
||||
src << "<span class='warning'>You need to stay in reaching distance to be picked up.</span>"
|
||||
if("No")
|
||||
src << "<span class='warning'>[H] decided not to pick you up.</span>"
|
||||
else
|
||||
return ..()
|
||||
if(Adjacent(H))
|
||||
get_scooped(H)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/mob/living/silicon/pai/on_forcemove(atom/newloc)
|
||||
if(card)
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
/mob/living/silicon/robot/drone/say(var/message)
|
||||
if(local_transmit)
|
||||
if (src.client)
|
||||
if(client.prefs.muted & MUTE_IC)
|
||||
src << "You cannot send IC messages (muted)."
|
||||
return 0
|
||||
if (src.client.handle_spam_prevention(message,MUTE_IC))
|
||||
return 0
|
||||
|
||||
message = sanitize(message)
|
||||
|
||||
if (stat == 2)
|
||||
return say_dead(message)
|
||||
|
||||
if(copytext(message,1,2) == "*")
|
||||
return emote(copytext(message,2))
|
||||
|
||||
if(copytext(message,1,2) == ";")
|
||||
var/datum/language/L = all_languages["Drone Talk"]
|
||||
if(istype(L))
|
||||
return L.broadcast(src,trim(copytext(message,2)))
|
||||
|
||||
//Must be concious to speak
|
||||
if (stat)
|
||||
return 0
|
||||
|
||||
var/list/listeners = hearers(5,src)
|
||||
listeners |= src
|
||||
|
||||
for(var/mob/living/silicon/D in listeners)
|
||||
if(D.client && D.local_transmit)
|
||||
D << "<b>[src]</b> transmits, \"[message]\""
|
||||
|
||||
for (var/mob/M in player_list)
|
||||
if (istype(M, /mob/new_player))
|
||||
continue
|
||||
else if(M.stat == 2 && M.client.prefs.toggles & CHAT_GHOSTEARS)
|
||||
if(M.client) M << "<b>[src]</b> transmits, \"[message]\""
|
||||
return 1
|
||||
return ..(message, 0)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user