Merge branch 'bleeding-edge-freeze' into viro

This commit is contained in:
Chinsky
2013-06-18 14:55:59 +04:00
52 changed files with 1441 additions and 881 deletions

View File

@@ -710,6 +710,7 @@
#include "code\modules\admin\verbs\striketeam_syndicate.dm" #include "code\modules\admin\verbs\striketeam_syndicate.dm"
#include "code\modules\admin\verbs\ticklag.dm" #include "code\modules\admin\verbs\ticklag.dm"
#include "code\modules\admin\verbs\tripAI.dm" #include "code\modules\admin\verbs\tripAI.dm"
#include "code\modules\admin\verbs\vox_raiders.dm"
#include "code\modules\assembly\assembly.dm" #include "code\modules\assembly\assembly.dm"
#include "code\modules\assembly\bomb.dm" #include "code\modules\assembly\bomb.dm"
#include "code\modules\assembly\helpers.dm" #include "code\modules\assembly\helpers.dm"
@@ -1001,6 +1002,7 @@
#include "code\modules\mob\living\simple_animal\parrot.dm" #include "code\modules\mob\living\simple_animal\parrot.dm"
#include "code\modules\mob\living\simple_animal\shade.dm" #include "code\modules\mob\living\simple_animal\shade.dm"
#include "code\modules\mob\living\simple_animal\simple_animal.dm" #include "code\modules\mob\living\simple_animal\simple_animal.dm"
#include "code\modules\mob\living\simple_animal\vox.dm"
#include "code\modules\mob\living\simple_animal\worm.dm" #include "code\modules\mob\living\simple_animal\worm.dm"
#include "code\modules\mob\living\simple_animal\friendly\cat.dm" #include "code\modules\mob\living\simple_animal\friendly\cat.dm"
#include "code\modules\mob\living\simple_animal\friendly\corgi.dm" #include "code\modules\mob\living\simple_animal\friendly\corgi.dm"

View File

@@ -67,6 +67,7 @@ datum/shuttle_controller
captain_announce("The shuttle has been recalled.") captain_announce("The shuttle has been recalled.")
setdirection(-1) setdirection(-1)
online = 1 online = 1
alert = 0 // set alert back to 0 after an admin recall
return return
// returns the time (in seconds) before shuttle arrival // returns the time (in seconds) before shuttle arrival

View File

@@ -1220,5 +1220,9 @@ datum/mind
mind.assigned_role = "Juggernaut" mind.assigned_role = "Juggernaut"
mind.special_role = "Cultist" mind.special_role = "Cultist"
/mob/living/simple_animal/vox/armalis/mind_initialize()
..()
mind.assigned_role = "Armalis"
mind.special_role = "Vox Raider"

View File

@@ -65,45 +65,11 @@ Not sure why this would be useful (it's not) but whatever. Ninjas need their smo
s_coold = 1 s_coold = 1
return return
//=======//9-8 TILE TELEPORT//=======//
//Click to to teleport 9-10 tiles in direction facing.
/obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt()
set name = "Phase Jaunt (10E)"
set desc = "Utilizes the internal VOID-shift device to rapidly transit in direction facing."
set category = "Ninja Ability"
set popup_menu = 0
var/C = 100
if(!ninjacost(C,1))
var/mob/living/carbon/human/U = affecting
var/turf/destination = get_teleport_loc(U.loc,U,9,1,3,1,0,1)
var/turf/mobloc = get_turf(U.loc)//To make sure that certain things work properly below.
if(destination&&istype(mobloc, /turf))//The turf check prevents unusual behavior. Like teleporting out of cryo pods, cloners, mechs, etc.
spawn(0)
playsound(U.loc, "sparks", 50, 1)
anim(mobloc,src,'icons/mob/mob.dmi',,"phaseout",,U.dir)
handle_teleport_grab(destination, U)
U.loc = destination
spawn(0)
spark_system.start()
playsound(U.loc, 'sound/effects/phasein.ogg', 25, 1)
playsound(U.loc, "sparks", 50, 1)
anim(U.loc,U,'icons/mob/mob.dmi',,"phasein",,U.dir)
spawn(0)
destination.kill_creatures(U)//Any living mobs in teleport area are gibbed. Check turf procs for how it does it.
s_coold = 1
cell.charge-=(C*10)
else
U << "\red The VOID-shift device is malfunctioning, <B>teleportation failed</B>."
return
//=======//RIGHT CLICK TELEPORT//=======// //=======//RIGHT CLICK TELEPORT//=======//
//Right click to teleport somewhere, almost exactly like admin jump to turf. //Right click to teleport somewhere, almost exactly like admin jump to turf.
/obj/item/clothing/suit/space/space_ninja/proc/ninjashift(turf/T in oview()) /obj/item/clothing/suit/space/space_ninja/proc/ninjashift(turf/T in oview())
set name = "Phase Shift (20E)" set name = "Phase Shift (1E)"
set desc = "Utilizes the internal VOID-shift device to rapidly transit to a destination in view." set desc = "Utilizes the internal VOID-shift device to rapidly transit to a destination in view."
set category = null//So it does not show up on the panel but can still be right-clicked. set category = null//So it does not show up on the panel but can still be right-clicked.
set src = usr.contents//Fixes verbs not attaching properly for objects. Praise the DM reference guide! set src = usr.contents//Fixes verbs not attaching properly for objects. Praise the DM reference guide!
@@ -125,11 +91,6 @@ Not sure why this would be useful (it's not) but whatever. Ninjas need their smo
playsound(U.loc, 'sound/effects/phasein.ogg', 25, 1) playsound(U.loc, 'sound/effects/phasein.ogg', 25, 1)
playsound(U.loc, 'sound/effects/sparks2.ogg', 50, 1) playsound(U.loc, 'sound/effects/sparks2.ogg', 50, 1)
anim(U.loc,U,'icons/mob/mob.dmi',,"phasein",,U.dir) anim(U.loc,U,'icons/mob/mob.dmi',,"phasein",,U.dir)
spawn(0)//Any living mobs in teleport area are gibbed.
T.kill_creatures(U)
s_coold = 1
cell.charge-=(C*10)
else else
U << "\red You cannot teleport into solid walls or from solid matter" U << "\red You cannot teleport into solid walls or from solid matter"
return return
@@ -137,16 +98,16 @@ Not sure why this would be useful (it's not) but whatever. Ninjas need their smo
//=======//EM PULSE//=======// //=======//EM PULSE//=======//
//Disables nearby tech equipment. //Disables nearby tech equipment.
/obj/item/clothing/suit/space/space_ninja/proc/ninjapulse() /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse()
set name = "EM Burst (25E)" set name = "EM Burst (1,000E)"
set desc = "Disable any nearby technology with a electro-magnetic pulse." set desc = "Disable any nearby technology with a electro-magnetic pulse."
set category = "Ninja Ability" set category = "Ninja Ability"
set popup_menu = 0 set popup_menu = 0
var/C = 250 var/C = 250
if(!ninjacost(C,1)) if(!ninjacost(C,100)) // EMP's now cost 1,000Energy about 30%
var/mob/living/carbon/human/U = affecting var/mob/living/carbon/human/U = affecting
playsound(U.loc, 'sound/effects/EMPulse.ogg', 60, 2) playsound(U.loc, 'sound/effects/EMPulse.ogg', 60, 2)
empulse(U, 4, 6) //Procs sure are nice. Slightly weaker than wizard's disable tch. empulse(U, 2, 3) //Procs sure are nice. Slightly weaker than wizard's disable tch.
s_coold = 2 s_coold = 2
cell.charge-=(C*10) cell.charge-=(C*10)
return return
@@ -154,13 +115,13 @@ Not sure why this would be useful (it's not) but whatever. Ninjas need their smo
//=======//ENERGY BLADE//=======// //=======//ENERGY BLADE//=======//
//Summons a blade of energy in active hand. //Summons a blade of energy in active hand.
/obj/item/clothing/suit/space/space_ninja/proc/ninjablade() /obj/item/clothing/suit/space/space_ninja/proc/ninjablade()
set name = "Energy Blade (5E)" set name = "Energy Blade (20E)"
set desc = "Create a focused beam of energy in your active hand." set desc = "Create a focused beam of energy in your active hand."
set category = "Ninja Ability" set category = "Ninja Ability"
set popup_menu = 0 set popup_menu = 0
var/C = 50 var/C = 50
if(!ninjacost(C)) if(!ninjacost(C, 800)) //Same spawn cost but higher upkeep cost
var/mob/living/carbon/human/U = affecting var/mob/living/carbon/human/U = affecting
if(!kamikaze) if(!kamikaze)
if(!U.get_active_hand()&&!istype(U.get_inactive_hand(), /obj/item/weapon/melee/energy/blade)) if(!U.get_active_hand()&&!istype(U.get_inactive_hand(), /obj/item/weapon/melee/energy/blade))
@@ -187,13 +148,13 @@ Not sure why this would be useful (it's not) but whatever. Ninjas need their smo
/*Shoots ninja stars at random people. /*Shoots ninja stars at random people.
This could be a lot better but I'm too tired atm.*/ This could be a lot better but I'm too tired atm.*/
/obj/item/clothing/suit/space/space_ninja/proc/ninjastar() /obj/item/clothing/suit/space/space_ninja/proc/ninjastar()
set name = "Energy Star (5E)" set name = "Energy Star (1,000E)"
set desc = "Launches an energy star at a random living target." set desc = "Launches an energy star at a random living target."
set category = "Ninja Ability" set category = "Ninja Ability"
set popup_menu = 0 set popup_menu = 0
var/C = 50 var/C = 50
if(!ninjacost(C)) if(!ninjacost(C,1))
var/mob/living/carbon/human/U = affecting var/mob/living/carbon/human/U = affecting
var/targets[] = list()//So yo can shoot while yo throw dawg var/targets[] = list()//So yo can shoot while yo throw dawg
for(var/mob/living/M in oview(loc)) for(var/mob/living/M in oview(loc))
@@ -212,7 +173,7 @@ This could be a lot better but I'm too tired atm.*/
A.current = curloc A.current = curloc
A.yo = targloc.y - curloc.y A.yo = targloc.y - curloc.y
A.xo = targloc.x - curloc.x A.xo = targloc.x - curloc.x
cell.charge-=(C*10) cell.charge-=(C*100)// Ninja stars now cost 100 energy, stil la fair chunk to avoid spamming, will run out of power quickly if used 3 or more times
A.process() A.process()
else else
U << "\red There are no targets in view." U << "\red There are no targets in view."
@@ -222,13 +183,13 @@ This could be a lot better but I'm too tired atm.*/
/*Allows the ninja to capture people, I guess. /*Allows the ninja to capture people, I guess.
Must right click on a mob to activate.*/ Must right click on a mob to activate.*/
/obj/item/clothing/suit/space/space_ninja/proc/ninjanet(mob/living/carbon/M in oview())//Only living carbon mobs. /obj/item/clothing/suit/space/space_ninja/proc/ninjanet(mob/living/carbon/M in oview())//Only living carbon mobs.
set name = "Energy Net (20E)" set name = "Energy Net (8,000E)"
set desc = "Captures a fallen opponent in a net of energy. Will teleport them to a holding facility after 30 seconds." set desc = "Captures a fallen opponent in a net of energy. Will teleport them to a holding facility after 30 seconds."
set category = null set category = null
set src = usr.contents set src = usr.contents
var/C = 200 var/C = 500
if(!ninjacost(C,1)&&iscarbon(M)) if(!ninjacost(C,80)&&iscarbon(M)) // Nets now cost 8,000
var/mob/living/carbon/human/U = affecting var/mob/living/carbon/human/U = affecting
if(M.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame. if(M.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame.
//if(M)//DEBUG //if(M)//DEBUG
@@ -249,7 +210,7 @@ Must right click on a mob to activate.*/
E.master = U E.master = U
spawn(0)//Parallel processing. spawn(0)//Parallel processing.
E.process(M) E.process(M)
cell.charge-=(C*10) cell.charge-=(C*100) // Nets now cost what should be most of a standard battery, since your taking someone out of the round
else else
U << "They are already trapped inside an energy net." U << "They are already trapped inside an energy net."
else else
@@ -270,7 +231,6 @@ Movement impairing would indicate drugs and the like.*/
//Wouldn't need to track adrenaline boosters if there was a miracle injection to get rid of paralysis and the like instantly. //Wouldn't need to track adrenaline boosters if there was a miracle injection to get rid of paralysis and the like instantly.
//For now, adrenaline boosters ARE the miracle injection. Well, radium, really. //For now, adrenaline boosters ARE the miracle injection. Well, radium, really.
U.SetParalysis(0) U.SetParalysis(0)
U.SetStunned(0)
U.SetWeakened(0) U.SetWeakened(0)
/* /*
Due to lag, it was possible to adrenaline boost but remain helpless while life.dm resets player stat. Due to lag, it was possible to adrenaline boost but remain helpless while life.dm resets player stat.

View File

@@ -1333,10 +1333,10 @@ It is possible to destroy the net by the occupant or someone else.
return return
process(var/mob/living/carbon/M as mob) process(var/mob/living/carbon/M as mob)
var/check = 30//30 seconds before teleportation. Could be extended I guess. var/check = 60//30 seconds before teleportation. Could be extended I guess. - Extended to one minute
var/mob_name = affecting.name//Since they will report as null if terminated before teleport. var/mob_name = affecting.name//Since they will report as null if terminated before teleport.
//The person can still try and attack the net when inside. //The person can still try and attack the net when inside.
while(!isnull(M)&&!isnull(src)&&check>0)//While M and net exist, and 30 seconds have not passed. while(!isnull(M)&&!isnull(src)&&check>0)//While M and net exist, and 60 seconds have not passed.
check-- check--
sleep(10) sleep(10)

View File

@@ -656,7 +656,6 @@ As such, it's hard-coded for now. No reason for it not to be, really.
/obj/item/clothing/suit/space/space_ninja/proc/grant_ninja_verbs() /obj/item/clothing/suit/space/space_ninja/proc/grant_ninja_verbs()
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjashift verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjashift
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjasmoke verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjasmoke
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjaboost verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjaboost
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse
@@ -669,8 +668,6 @@ As such, it's hard-coded for now. No reason for it not to be, really.
/obj/item/clothing/suit/space/space_ninja/proc/remove_ninja_verbs() /obj/item/clothing/suit/space/space_ninja/proc/remove_ninja_verbs()
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjashift verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjashift
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjasmoke
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjaboost verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjaboost
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjablade verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjablade
@@ -681,11 +678,7 @@ As such, it's hard-coded for now. No reason for it not to be, really.
/obj/item/clothing/suit/space/space_ninja/proc/grant_kamikaze(mob/living/carbon/U) /obj/item/clothing/suit/space/space_ninja/proc/grant_kamikaze(mob/living/carbon/U)
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjashift verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjashift
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjastar
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjanet verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjanet
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjaslayer verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjaslayer
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjawalk verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjawalk
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjamirage verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjamirage
@@ -710,11 +703,8 @@ As such, it's hard-coded for now. No reason for it not to be, really.
/obj/item/clothing/suit/space/space_ninja/proc/remove_kamikaze(mob/living/carbon/U) /obj/item/clothing/suit/space/space_ninja/proc/remove_kamikaze(mob/living/carbon/U)
if(kamikaze) if(kamikaze)
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjashift verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjashift
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjastar verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjastar
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjanet
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjaslayer verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjaslayer
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjawalk verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjawalk
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjamirage verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjamirage

View File

@@ -64,6 +64,7 @@
/var/const/access_gateway = 62 /var/const/access_gateway = 62
/var/const/access_sec_doors = 63 // Security front doors /var/const/access_sec_doors = 63 // Security front doors
/var/const/access_psychiatrist = 64 // Psychiatrist's office /var/const/access_psychiatrist = 64 // Psychiatrist's office
/var/const/access_xenoarch = 65
//BEGIN CENTCOM ACCESS //BEGIN CENTCOM ACCESS
/*Should leave plenty of room if we need to add more access levels. /*Should leave plenty of room if we need to add more access levels.
@@ -209,7 +210,7 @@
access_hydroponics, access_library, access_lawyer, access_virology, access_psychiatrist, access_cmo, access_qm, access_clown, access_mime, access_surgery, access_hydroponics, access_library, access_lawyer, access_virology, access_psychiatrist, access_cmo, access_qm, access_clown, access_mime, access_surgery,
access_theatre, access_research, access_mining, access_mailsorting, access_theatre, access_research, access_mining, access_mailsorting,
access_heads_vault, access_mining_station, access_xenobiology, access_ce, access_hop, access_hos, access_RC_announce, access_heads_vault, access_mining_station, access_xenobiology, access_ce, access_hop, access_hos, access_RC_announce,
access_keycard_auth, access_tcomsat, access_gateway) access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch)
/proc/get_all_centcom_access() /proc/get_all_centcom_access()
return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_medical, access_cent_living, access_cent_storage, access_cent_teleporter, access_cent_creed, access_cent_captain) return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_medical, access_cent_living, access_cent_storage, access_cent_teleporter, access_cent_creed, access_cent_captain)
@@ -226,7 +227,7 @@
if(2) //medbay if(2) //medbay
return list(access_medical, access_genetics, access_morgue, access_chemistry, access_psychiatrist, access_virology, access_surgery, access_cmo) return list(access_medical, access_genetics, access_morgue, access_chemistry, access_psychiatrist, access_virology, access_surgery, access_cmo)
if(3) //research if(3) //research
return list(access_research, access_tox, access_tox_storage, access_robotics, access_xenobiology, access_rd) return list(access_research, access_tox, access_tox_storage, access_robotics, access_xenobiology, access_xenoarch, access_rd)
if(4) //engineering and maintenance if(4) //engineering and maintenance
return list(access_construction, access_maint_tunnels, access_engine, access_engine_equip, access_external_airlocks, access_tech_storage, access_atmospherics, access_ce) return list(access_construction, access_maint_tunnels, access_engine, access_engine_equip, access_external_airlocks, access_tech_storage, access_atmospherics, access_ce)
if(5) //command if(5) //command
@@ -370,6 +371,8 @@
return "Mining EVA" return "Mining EVA"
if(access_xenobiology) if(access_xenobiology)
return "Xenobiology Lab" return "Xenobiology Lab"
if(access_xenoarch)
return "Xenoarchaeology"
if(access_hop) if(access_hop)
return "Head of Personnel" return "Head of Personnel"
if(access_hos) if(access_hos)
@@ -412,7 +415,7 @@
return list("Assistant", "Captain", "Head of Personnel", "Bartender", "Chef", "Botanist", "Quartermaster", "Cargo Technician", return list("Assistant", "Captain", "Head of Personnel", "Bartender", "Chef", "Botanist", "Quartermaster", "Cargo Technician",
"Shaft Miner", /*"Clown", "Mime", */"Janitor", "Librarian", "Lawyer", "Chaplain", "Chief Engineer", "Station Engineer", "Shaft Miner", /*"Clown", "Mime", */"Janitor", "Librarian", "Lawyer", "Chaplain", "Chief Engineer", "Station Engineer",
"Atmospheric Technician", "Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Virologist", "Atmospheric Technician", "Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Virologist",
"Research Director", "Scientist", "Roboticist", "Head of Security", "Warden", "Detective", "Security Officer") "Research Director", "Scientist", "Xenobiologist", "Roboticist", "Head of Security", "Warden", "Detective", "Security Officer")
/proc/get_all_centcom_jobs() /proc/get_all_centcom_jobs()
return list("VIP Guest","Custodian","Thunderdome Overseer","Intel Officer","Medical Officer","Death Commando","Research Officer","BlackOps Commander","Supreme Commander") return list("VIP Guest","Custodian","Thunderdome Overseer","Intel Officer","Medical Officer","Death Commando","Research Officer","BlackOps Commander","Supreme Commander")

View File

@@ -12,11 +12,11 @@
access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
access_tox_storage, access_teleporter, access_sec_doors, access_tox_storage, access_teleporter, access_sec_doors,
access_research, access_robotics, access_xenobiology, access_ai_upload, access_research, access_robotics, access_xenobiology, access_ai_upload,
access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway) access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch)
minimal_access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, minimal_access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
access_tox_storage, access_teleporter, access_sec_doors, access_tox_storage, access_teleporter, access_sec_doors,
access_research, access_robotics, access_xenobiology, access_ai_upload, access_research, access_robotics, access_xenobiology, access_ai_upload,
access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway) access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch)
minimal_player_age = 7 minimal_player_age = 7
equip(var/mob/living/carbon/human/H) equip(var/mob/living/carbon/human/H)
@@ -44,8 +44,8 @@
spawn_positions = 3 spawn_positions = 3
supervisors = "the research director" supervisors = "the research director"
selection_color = "#ffeeff" selection_color = "#ffeeff"
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology) access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch)
minimal_access = list(access_tox, access_tox_storage, access_research) minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch)
alt_titles = list("Xenoarcheologist", "Anomalist", "Plasma Researcher") alt_titles = list("Xenoarcheologist", "Anomalist", "Plasma Researcher")
equip(var/mob/living/carbon/human/H) equip(var/mob/living/carbon/human/H)

View File

@@ -1238,7 +1238,11 @@ About the new airlock wires panel:
var/obj/item/weapon/airlock_electronics/ae var/obj/item/weapon/airlock_electronics/ae
if(!electronics) if(!electronics)
ae = new/obj/item/weapon/airlock_electronics( src.loc ) ae = new/obj/item/weapon/airlock_electronics( src.loc )
ae.conf_access = src.req_access if(src.req_access.len)
ae.conf_access = src.req_access
else if (src.req_one_access.len)
ae.conf_access = src.req_one_access
ae.one_access = 1
else else
ae = electronics ae = electronics
electronics = null electronics = null

View File

@@ -11,6 +11,7 @@
req_access = list(access_engine) req_access = list(access_engine)
var/list/conf_access = null var/list/conf_access = null
var/one_access = 0 //if set to 1, door would receive req_one_access instead of req_access
var/last_configurator = null var/last_configurator = null
var/locked = 1 var/locked = 1
@@ -33,6 +34,8 @@
else else
t1 += "<a href='?src=\ref[src];logout=1'>Block</a><hr>" t1 += "<a href='?src=\ref[src];logout=1'>Block</a><hr>"
t1 += "Access requirement is set to "
t1 += one_access ? "<a style='color: green' href='?src=\ref[src];one_access=1'>ONE</a><hr>" : "<a style='color: red' href='?src=\ref[src];one_access=1'>ALL</a><hr>"
t1 += conf_access == null ? "<font color=red>All</font><br>" : "<a href='?src=\ref[src];access=all'>All</a><br>" t1 += conf_access == null ? "<font color=red>All</font><br>" : "<a href='?src=\ref[src];access=all'>All</a><br>"
@@ -44,6 +47,8 @@
if (!conf_access || !conf_access.len || !(acc in conf_access)) if (!conf_access || !conf_access.len || !(acc in conf_access))
t1 += "<a href='?src=\ref[src];access=[acc]'>[aname]</a><br>" t1 += "<a href='?src=\ref[src];access=[acc]'>[aname]</a><br>"
else if(one_access)
t1 += "<a style='color: green' href='?src=\ref[src];access=[acc]'>[aname]</a><br>"
else else
t1 += "<a style='color: red' href='?src=\ref[src];access=[acc]'>[aname]</a><br>" t1 += "<a style='color: red' href='?src=\ref[src];access=[acc]'>[aname]</a><br>"
@@ -75,6 +80,9 @@
if (href_list["logout"]) if (href_list["logout"])
locked = 1 locked = 1
if (href_list["one_access"])
one_access = !one_access
if (href_list["access"]) if (href_list["access"])
toggle_access(href_list["access"]) toggle_access(href_list["access"])

View File

@@ -130,6 +130,21 @@
new /obj/item/weapon/shard(src.loc) new /obj/item/weapon/shard(src.loc)
var/obj/item/weapon/cable_coil/CC = new /obj/item/weapon/cable_coil(src.loc) var/obj/item/weapon/cable_coil/CC = new /obj/item/weapon/cable_coil(src.loc)
CC.amount = 2 CC.amount = 2
var/obj/item/weapon/airlock_electronics/ae
if(!electronics)
ae = new/obj/item/weapon/airlock_electronics( src.loc )
if(src.req_access.len)
ae.conf_access = src.req_access
else if (src.req_one_access.len)
ae.conf_access = src.req_one_access
ae.one_access = 1
else
ae = electronics
electronics = null
ae.loc = src.loc
if(operating == -1)
ae.icon_state = "door_electronics_smoked"
operating = 0
src.density = 0 src.density = 0
del(src) del(src)
return return
@@ -162,15 +177,9 @@
if(istype(user, /mob/living/carbon/alien/humanoid) || istype(user, /mob/living/carbon/slime/adult)) if(istype(user, /mob/living/carbon/alien/humanoid) || istype(user, /mob/living/carbon/slime/adult))
if(src.operating) if(src.operating)
return return
src.health = max(0, src.health - 25)
playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
visible_message("\red <B>[user] smashes against the [src.name].</B>", 1) visible_message("\red <B>[user] smashes against the [src.name].</B>", 1)
if (src.health <= 0) take_damage(25)
new /obj/item/weapon/shard(src.loc)
var/obj/item/weapon/cable_coil/CC = new /obj/item/weapon/cable_coil(src.loc)
CC.amount = 2
src.density = 0
del(src)
else else
return src.attack_hand(user) return src.attack_hand(user)
@@ -181,7 +190,7 @@
/obj/machinery/door/window/attackby(obj/item/weapon/I as obj, mob/user as mob) /obj/machinery/door/window/attackby(obj/item/weapon/I as obj, mob/user as mob)
//If it's in the process of opening/closing, ignore the click //If it's in the process of opening/closing, ignore the click
if (src.operating) if (src.operating == 1)
return return
//Emags and ninja swords? You may pass. //Emags and ninja swords? You may pass.
@@ -199,19 +208,50 @@
open() open()
return 1 return 1
//If it's emagged, crowbar can pry electronics out.
if (src.operating == -1 && istype(I, /obj/item/weapon/crowbar))
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
user.visible_message("[user] removes the electronics from the windoor.", "You start to remove electronics from the windoor.")
if (do_after(user,40))
user << "\blue You removed the windoor electronics!"
var/obj/structure/windoor_assembly/wa = new/obj/structure/windoor_assembly(src.loc)
if (istype(src, /obj/machinery/door/window/brigdoor))
wa.secure = "secure_"
wa.name = "Secure Wired Windoor Assembly"
else
wa.name = "Wired Windoor Assembly"
if (src.base_state == "right" || src.base_state == "rightsecure")
wa.facing = "r"
wa.dir = src.dir
wa.state = "02"
wa.update_icon()
var/obj/item/weapon/airlock_electronics/ae
if(!electronics)
ae = new/obj/item/weapon/airlock_electronics( src.loc )
if(src.req_access.len)
ae.conf_access = src.req_access
else if (src.req_one_access.len)
ae.conf_access = src.req_one_access
ae.one_access = 1
else
ae = electronics
electronics = null
ae.loc = src.loc
ae.icon_state = "door_electronics_smoked"
operating = 0
del(src)
return
//If it's a weapon, smash windoor. Unless it's an id card, agent card, ect.. then ignore it (Cards really shouldnt damage a door anyway) //If it's a weapon, smash windoor. Unless it's an id card, agent card, ect.. then ignore it (Cards really shouldnt damage a door anyway)
if(src.density && istype(I, /obj/item/weapon) && !istype(I, /obj/item/weapon/card)) if(src.density && istype(I, /obj/item/weapon) && !istype(I, /obj/item/weapon/card))
var/aforce = I.force var/aforce = I.force
if(I.damtype == BRUTE || I.damtype == BURN)
src.health = max(0, src.health - aforce)
playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
visible_message("\red <B>[src] was hit by [I].</B>") visible_message("\red <B>[src] was hit by [I].</B>")
if (src.health <= 0) if(I.damtype == BRUTE || I.damtype == BURN)
new /obj/item/weapon/shard(src.loc) take_damage(aforce)
var/obj/item/weapon/cable_coil/CC = new /obj/item/weapon/cable_coil(src.loc)
CC.amount = 2
src.density = 0
del(src)
return return

View File

@@ -153,6 +153,7 @@
icon_state = "knife" icon_state = "knife"
desc = "A general purpose Chef's Knife made by SpaceCook Incorporated. Guaranteed to stay sharp for years to come." desc = "A general purpose Chef's Knife made by SpaceCook Incorporated. Guaranteed to stay sharp for years to come."
flags = FPRINT | TABLEPASS | CONDUCT flags = FPRINT | TABLEPASS | CONDUCT
sharp = 1
force = 10.0 force = 10.0
w_class = 3.0 w_class = 3.0
throwforce = 6.0 throwforce = 6.0

View File

@@ -146,5 +146,5 @@
item_state = "harpoon" item_state = "harpoon"
force = 20 force = 20
throwforce = 15 throwforce = 15
w_class = 2 w_class = 3
attack_verb = list("jabbed","stabbed","ripped") attack_verb = list("jabbed","stabbed","ripped")

View File

@@ -421,7 +421,11 @@ obj/structure/door_assembly
door = new src.airlock_type( src.loc ) door = new src.airlock_type( src.loc )
//door.req_access = src.req_access //door.req_access = src.req_access
door.electronics = src.electronics door.electronics = src.electronics
door.req_access = src.electronics.conf_access if(src.electronics.one_access)
door.req_access = null
door.req_one_access = src.electronics.conf_access
else
door.req_access = src.electronics.conf_access
if(created_name) if(created_name)
door.name = created_name door.name = created_name
src.electronics.loc = door src.electronics.loc = door

View File

@@ -107,17 +107,17 @@ obj/structure/windoor_assembly/Del()
src.name = "Windoor Assembly" src.name = "Windoor Assembly"
//Adding plasteel makes the assembly a secure windoor assembly. Step 2 (optional) complete. //Adding plasteel makes the assembly a secure windoor assembly. Step 2 (optional) complete.
else if(istype(W, /obj/item/stack/sheet/plasteel) && !secure) else if(istype(W, /obj/item/stack/rods) && !secure)
var/obj/item/stack/sheet/plasteel/P = W var/obj/item/stack/rods/R = W
if(P.amount < 2) if(R.amount < 4)
user << "\red You need more plasteel to do this." user << "\red You need more rods to do this."
return return
user << "\blue You start to reinforce the windoor with plasteel." user << "\blue You start to reinforce the windoor with rods."
if(do_after(user,40)) if(do_after(user,40))
if(!src) return if(!src) return
P.use(2) R.use(4)
user << "\blue You reinforce the windoor." user << "\blue You reinforce the windoor."
src.secure = "secure_" src.secure = "secure_"
if(src.anchored) if(src.anchored)
@@ -145,7 +145,7 @@ obj/structure/windoor_assembly/Del()
if("02") if("02")
//Removing wire from the assembly. Step 5 undone. //Removing wire from the assembly. Step 5 undone.
if(istype(W, /obj/item/weapon/wirecutters)) if(istype(W, /obj/item/weapon/wirecutters) && !src.electronics)
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly.") user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly.")
@@ -156,12 +156,12 @@ obj/structure/windoor_assembly/Del()
new/obj/item/weapon/cable_coil(get_turf(user), 1) new/obj/item/weapon/cable_coil(get_turf(user), 1)
src.state = "01" src.state = "01"
if(src.secure) if(src.secure)
src.name = "Secure Wired Windoor Assembly" src.name = "Secure Anchored Windoor Assembly"
else else
src.name = "Wired Windoor Assembly" src.name = "Anchored Windoor Assembly"
//Adding airlock electronics for access. Step 6 complete. //Adding airlock electronics for access. Step 6 complete.
else if(istype(W, /obj/item/weapon/airlock_electronics)) else if(istype(W, /obj/item/weapon/airlock_electronics) && W:icon_state != "door_electronics_smoked")
playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly.") user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly.")
@@ -177,22 +177,20 @@ obj/structure/windoor_assembly/Del()
W.loc = src.loc W.loc = src.loc
//Screwdriver to remove airlock electronics. Step 6 undone. //Screwdriver to remove airlock electronics. Step 6 undone.
else if(istype(W, /obj/item/weapon/screwdriver)) else if(istype(W, /obj/item/weapon/screwdriver) && src.electronics)
playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to uninstall electronics from the airlock assembly.") user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to uninstall electronics from the airlock assembly.")
if(do_after(user, 40)) if(do_after(user, 40))
if(!src) return if(!src || !src.electronics) return
user << "\blue You've removed the airlock electronics!" user << "\blue You've removed the airlock electronics!"
src.name = "Wired Windoor Assembly" if(src.secure)
var/obj/item/weapon/airlock_electronics/ae src.name = "Secure Wired Windoor Assembly"
if (!electronics)
ae = new/obj/item/weapon/airlock_electronics( src.loc )
else else
ae = electronics src.name = "Wired Windoor Assembly"
electronics = null var/obj/item/weapon/airlock_electronics/ae = electronics
ae.loc = src.loc electronics = null
ae.loc = src.loc
//Crowbar to complete the assembly, Step 7 complete. //Crowbar to complete the assembly, Step 7 complete.
else if(istype(W, /obj/item/weapon/crowbar)) else if(istype(W, /obj/item/weapon/crowbar))
@@ -221,7 +219,11 @@ obj/structure/windoor_assembly/Del()
windoor.dir = src.dir windoor.dir = src.dir
windoor.density = 0 windoor.density = 0
windoor.req_access = src.electronics.conf_access if(src.electronics.one_access)
windoor.req_access = null
windoor.req_one_access = src.electronics.conf_access
else
windoor.req_access = src.electronics.conf_access
windoor.electronics = src.electronics windoor.electronics = src.electronics
src.electronics.loc = windoor src.electronics.loc = windoor
else else
@@ -235,7 +237,11 @@ obj/structure/windoor_assembly/Del()
windoor.dir = src.dir windoor.dir = src.dir
windoor.density = 0 windoor.density = 0
windoor.req_access = src.electronics.conf_access if(src.electronics.one_access)
windoor.req_access = null
windoor.req_one_access = src.electronics.conf_access
else
windoor.req_access = src.electronics.conf_access
windoor.electronics = src.electronics windoor.electronics = src.electronics
src.electronics.loc = windoor src.electronics.loc = windoor

View File

@@ -11,31 +11,31 @@
if("1") if("1")
log_admin("[key_name(usr)] has spawned a traitor.") log_admin("[key_name(usr)] has spawned a traitor.")
if(!src.makeTraitors()) if(!src.makeTraitors())
usr << "\red Unfortunatly there were no candidates available" usr << "\red Unfortunately there weren't enough candidates available."
if("2") if("2")
log_admin("[key_name(usr)] has spawned a changeling.") log_admin("[key_name(usr)] has spawned a changeling.")
if(!src.makeChanglings()) if(!src.makeChanglings())
usr << "\red Unfortunatly there were no candidates available" usr << "\red Unfortunately there weren't enough candidates available."
if("3") if("3")
log_admin("[key_name(usr)] has spawned revolutionaries.") log_admin("[key_name(usr)] has spawned revolutionaries.")
if(!src.makeRevs()) if(!src.makeRevs())
usr << "\red Unfortunatly there were no candidates available" usr << "\red Unfortunately there weren't enough candidates available."
if("4") if("4")
log_admin("[key_name(usr)] has spawned a cultists.") log_admin("[key_name(usr)] has spawned a cultists.")
if(!src.makeCult()) if(!src.makeCult())
usr << "\red Unfortunatly there were no candidates available" usr << "\red Unfortunately there weren't enough candidates available."
if("5") if("5")
log_admin("[key_name(usr)] has spawned a malf AI.") log_admin("[key_name(usr)] has spawned a malf AI.")
if(!src.makeMalfAImode()) if(!src.makeMalfAImode())
usr << "\red Unfortunatly there were no candidates available" usr << "\red Unfortunately there weren't enough candidates available."
if("6") if("6")
log_admin("[key_name(usr)] has spawned a wizard.") log_admin("[key_name(usr)] has spawned a wizard.")
if(!src.makeWizard()) if(!src.makeWizard())
usr << "\red Unfortunatly there were no candidates available" usr << "\red Unfortunately there weren't enough candidates available."
if("7") if("7")
log_admin("[key_name(usr)] has spawned a nuke team.") log_admin("[key_name(usr)] has spawned a nuke team.")
if(!src.makeNukeTeam()) if(!src.makeNukeTeam())
usr << "\red Unfortunatly there were no candidates available" usr << "\red Unfortunately there weren't enough candidates available."
if("8") if("8")
log_admin("[key_name(usr)] has spawned a ninja.") log_admin("[key_name(usr)] has spawned a ninja.")
src.makeSpaceNinja() src.makeSpaceNinja()
@@ -44,8 +44,10 @@
src.makeAliens() src.makeAliens()
if("10") if("10")
log_admin("[key_name(usr)] has spawned a death squad.") log_admin("[key_name(usr)] has spawned a death squad.")
if(!src.makeDeathsquad()) if("11")
usr << "\red Unfortunatly there were no candidates available" log_admin("[key_name(usr)] has spawned vox raiders.")
if(!src.makeVoxRaiders())
usr << "\red Unfortunately there weren't enough candidates available."
else if(href_list["dbsearchckey"] || href_list["dbsearchadmin"]) else if(href_list["dbsearchckey"] || href_list["dbsearchadmin"])
var/adminckey = href_list["dbsearchadmin"] var/adminckey = href_list["dbsearchadmin"]
var/playerckey = href_list["dbsearchckey"] var/playerckey = href_list["dbsearchckey"]

View File

@@ -17,6 +17,7 @@ client/proc/one_click_antag()
<a href='?src=\ref[src];makeAntag=4'>Make Cult</a><br> <a href='?src=\ref[src];makeAntag=4'>Make Cult</a><br>
<a href='?src=\ref[src];makeAntag=5'>Make Malf AI</a><br> <a href='?src=\ref[src];makeAntag=5'>Make Malf AI</a><br>
<a href='?src=\ref[src];makeAntag=6'>Make Wizard (Requires Ghosts)</a><br> <a href='?src=\ref[src];makeAntag=6'>Make Wizard (Requires Ghosts)</a><br>
<a href='?src=\ref[src];makeAntag=11'>Make Vox Raiders (Requires Ghosts)</a><br>
"} "}
/* These dont work just yet /* These dont work just yet
Ninja, aliens and deathsquad I have not looked into yet Ninja, aliens and deathsquad I have not looked into yet
@@ -429,4 +430,94 @@ client/proc/one_click_antag()
ticker.mode.traitors += new_syndicate_commando.mind ticker.mode.traitors += new_syndicate_commando.mind
new_syndicate_commando.equip_syndicate_commando(syndicate_leader_selected) new_syndicate_commando.equip_syndicate_commando(syndicate_leader_selected)
return new_syndicate_commando return new_syndicate_commando
/datum/admins/proc/makeVoxRaiders()
var/list/mob/dead/observer/candidates = list()
var/mob/dead/observer/theghost = null
var/time_passed = world.time
var/input = "Disregard shinies, acquire hardware."
var/leader_chosen = 0 //when the leader is chosen. The last person spawned.
//Generates a list of candidates from active ghosts. The admin picks which players to respawn as the vox.
for(var/mob/dead/observer/G in player_list)
spawn(0)
if(is_alien_whitelisted(src, "Vox") || !config.usealienwhitelist)
switch(alert(G,"Do you wish to be considered for a vox raiding party arriving on the station?","Please answer in 30 seconds!","Yes","No"))
if("Yes")
if((world.time-time_passed)>300)//If more than 30 game seconds passed.
return
candidates += G
if("No")
return
else
return
sleep(300) //Debug.
for(var/mob/dead/observer/G in candidates)
if(!G.key)
candidates.Remove(G)
if(candidates.len)
var/raiders = 4
//Spawns vox raiders and equips them.
for (var/obj/effect/landmark/L in world)
if(L.name == "Response Team")
if(raiders<=0)
break
var/mob/living/carbon/human/new_vox = create_vox_raider(L, leader_chosen)
while((!theghost || !theghost.client) && candidates.len)
theghost = pick(candidates)
candidates.Remove(theghost)
if(!theghost)
del(new_vox)
break
new_vox.key = theghost.key
new_vox << "\blue You are a Vox Primalis, fresh out of the Shoal. Your ship has arrived at the Tau Ceti system hosting the NSV Exodus... or was it the Luna? NSS? Utopia? Nobody is really sure, but everyong is raring to start pillaging! Your current goal is: \red<B> [input]</B>"
new_vox << "\red Don't forget to turn on your nitrogen internals!"
raiders--
if(raiders >= 4)
return 0
else
return 0
return 1
/datum/admins/proc/create_vox_raider(obj/spawn_location, leader_chosen = 0)
var/mob/living/carbon/human/new_vox = new(spawn_location.loc)
new_vox.gender = pick(MALE, FEMALE)
var/datum/preferences/A = new() //Randomize appearance for the raider.
A.randomize_appearance_for(new_vox)
new_vox.h_style = "Short Vox Quills"
new_vox.regenerate_icons()
var/sounds = rand(2,10)
var/i = 0
var/newname = ""
while(i<=sounds)
i++
newname += pick(list("ti","hi","ki","ya","ta","ha","ka","ya","chi","cha","kah"))
new_vox.real_name = capitalize(newname)
new_vox.name = new_vox.real_name
new_vox.age = rand(12,20)
new_vox.dna.ready_dna(new_vox) // Creates DNA.
new_vox.dna.mutantrace = "vox" // Actually makes the vox! How about that.
new_vox.mind_initialize()
new_vox.mind.assigned_role = "MODE"
new_vox.mind.special_role = "Vox Raider"
ticker.mode.traitors += new_vox.mind
new_vox.equip_vox_raider()
return new_vox

View File

@@ -0,0 +1,66 @@
/mob/living/carbon/human/proc/equip_vox_raider()
var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate(src)
R.set_frequency(SYND_FREQ) //Same frequency as the syndicate team in Nuke mode.
equip_to_slot_or_del(R, slot_ears)
equip_to_slot_or_del(new /obj/item/clothing/under/vox/vox_robes(src), slot_w_uniform)
equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/vox(src), slot_shoes) // REPLACE THESE WITH CODED VOX ALTERNATIVES.
equip_to_slot_or_del(new /obj/item/clothing/gloves/yellow/vox(src), slot_gloves) // AS ABOVE.
switch(rand(1,4)) // Come up with a better way of doing this - ticker of some sort maybe.
if(1) // Vox raider!
equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/carapace(src), slot_wear_suit)
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/carapace(src), slot_head)
equip_to_slot_or_del(new /obj/item/weapon/melee/telebaton(src), slot_belt)
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(src), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE.
equip_to_slot_or_del(new /obj/item/device/chameleon(src), slot_l_store)
var/obj/item/weapon/crossbow/W = new(src)
W.cell = new /obj/item/weapon/cell/crap(W)
W.cell.charge = 500
equip_to_slot_or_del(W, slot_r_hand)
if(2) // Vox engineer!
equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/pressure(src), slot_wear_suit)
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/pressure(src), slot_head)
equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(src), slot_belt)
equip_to_slot_or_del(new /obj/item/clothing/glasses/meson(src), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE.
equip_to_slot_or_del(new /obj/item/weapon/storage/box/emps(src), slot_l_store)
equip_to_slot_or_del(new /obj/item/weapon/pickaxe/plasmacutter(src), slot_r_hand)
if(3) // Vox saboteur!
equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/carapace(src), slot_wear_suit)
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/carapace(src), slot_head)
equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(src), slot_belt)
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(src), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE.
equip_to_slot_or_del(new /obj/item/weapon/card/emag(src), slot_l_store)
var/obj/item/weapon/storage/pneumatic/W = new(src)
W.tank = new /obj/item/weapon/tank/nitrogen(W)
equip_to_slot_or_del(W, slot_r_hand)
if(4) // Vox medic!
equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/pressure(src), slot_wear_suit)
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/pressure(src), slot_head)
equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(src), slot_belt) // Who needs actual surgical tools?
equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health(src), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE.
equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray(src), slot_l_store)
equip_to_slot_or_del(new /obj/item/weapon/circular_saw(src), slot_l_hand)
equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/toxin(src), slot_r_hand)
equip_to_slot_or_del(new /obj/item/clothing/mask/breath/vox(src), slot_wear_mask)
equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(src), slot_back)
equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_r_store)
var/obj/item/weapon/card/id/syndicate/W = new(src)
W.name = "[real_name]'s Legitimate Human ID Card"
W.icon_state = "id"
W.access = list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage, access_syndicate)
W.assignment = "Trader"
W.registered_name = real_name
equip_to_slot_or_del(W, slot_wear_id)
return 1

View File

@@ -792,9 +792,6 @@ datum/preferences
if(is_alien_whitelisted(user, "Skrell")) //Check for Skrell and admins if(is_alien_whitelisted(user, "Skrell")) //Check for Skrell and admins
new_species += "Skrell" new_species += "Skrell"
whitelisted = 1 whitelisted = 1
if(is_alien_whitelisted(user, "Vox")) //Check for Vox and admins
new_species += "Vox"
whitelisted = 1
if(is_alien_whitelisted(user, "Kidan")) // Check for Kidan and admins if(is_alien_whitelisted(user, "Kidan")) // Check for Kidan and admins
new_species += "Kidan" new_species += "Kidan"
whitelisted = 1 whitelisted = 1
@@ -806,7 +803,6 @@ datum/preferences
new_species += "Tajaran" new_species += "Tajaran"
new_species += "Unathi" new_species += "Unathi"
new_species += "Skrell" new_species += "Skrell"
new_species += "Vox"
new_species += "Kidan" new_species += "Kidan"
species = input("Please select a species", "Character Generation", null) in new_species species = input("Please select a species", "Character Generation", null) in new_species

View File

@@ -104,4 +104,56 @@
desc = "Weird and flowing!" desc = "Weird and flowing!"
icon_state = "vox-casual-2" icon_state = "vox-casual-2"
color = "vox-casual-2" color = "vox-casual-2"
item_state = "vox-casual-2" item_state = "vox-casual-2"
/obj/item/clothing/gloves/yellow/vox
desc = "These bizarre gauntlets seem to be fitted for... bird claws?"
name = "insulated gauntlets"
icon_state = "gloves-vox"
item_state = "gloves-vox"
siemens_coefficient = 0
permeability_coefficient = 0.05
color="gloves-vox"
/obj/item/clothing/gloves/yellow/vox/mob_can_equip(M as mob, slot)
var/mob/living/carbon/human/U = M
if(U.dna.mutantrace != "vox")
U << "<span class='warning'>This clearly isn't designed for your species!</span>"
return 0
return ..()
/obj/item/clothing/shoes/magboots/vox
desc = "A pair of heavy, jagged armoured foot pieces, seemingly suitable for a velociraptor."
name = "vox boots"
item_state = "boots-vox"
icon_state = "boots-vox"
toggle()
name = "Toggle Floor Grip"
if(src.magpulse)
src.flags &= ~NOSLIP
src.magpulse = 0
usr << "You relax your deathgrip on the flooring."
else
src.flags |= NOSLIP
src.magpulse = 1
usr << "You dig your claws deeply into the flooring, bracing yourself."
examine()
set src in view()
..()
var/state = "loosely"
if(src.flags&NOSLIP)
state = "tightly"
usr << "The wearer seems to be gripping the floor [state]."
/obj/item/clothing/shoes/magboots/vox/mob_can_equip(M as mob, slot)
var/mob/living/carbon/human/U = M
if(U.dna.mutantrace != "vox")
U << "<span class='warning'>This clearly isn't designed for your species!</span>"
return 0
return ..()

View File

@@ -34,9 +34,11 @@
attack(mob/living/carbon/human/M as mob, mob/user as mob) attack(mob/living/carbon/human/M as mob, mob/user as mob)
if (!ishuman(M)) if (!ishuman(M))
user << "\red [M] is not human and cannot have the fingerprints." user << "\red [M] is not human and cannot have the fingerprints."
flick("forensic0",src)
return 0 return 0
if (( !( istype(M.dna, /datum/dna) ) || M.gloves) ) if (( !( istype(M.dna, /datum/dna) ) || M.gloves) )
user << "\blue No fingerprints found on [M]" user << "\blue No fingerprints found on [M]"
flick("forensic0",src)
return 0 return 0
else else
if (src.amount < 1) if (src.amount < 1)
@@ -71,6 +73,7 @@
return return
if(istype(A,/obj/item/weapon/f_card)) if(istype(A,/obj/item/weapon/f_card))
user << "The scanner displays on the screen: \"ERROR 43: Object on Excluded Object List.\"" user << "The scanner displays on the screen: \"ERROR 43: Object on Excluded Object List.\""
flick("forensic0",src)
return return
add_fingerprint(user) add_fingerprint(user)
@@ -81,6 +84,7 @@
if(!isnull(A.blood_DNA)) if(!isnull(A.blood_DNA))
for(var/blood in A.blood_DNA) for(var/blood in A.blood_DNA)
user << "\blue Blood type: [A.blood_DNA[blood]]\nDNA: [blood]" user << "\blue Blood type: [A.blood_DNA[blood]]\nDNA: [blood]"
flick("forensic2",src)
return return
//General //General
@@ -88,10 +92,12 @@
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\ user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\
"\blue Unable to locate any fingerprints, materials, fibers, or blood on [A]!",\ "\blue Unable to locate any fingerprints, materials, fibers, or blood on [A]!",\
"You hear a faint hum of electrical equipment.") "You hear a faint hum of electrical equipment.")
flick("forensic0",src)
return 0 return 0
if(add_data(A)) if(add_data(A))
user << "\blue Object already in internal memory. Consolidating data..." user << "\blue Object already in internal memory. Consolidating data..."
flick("forensic2",src)
return return
@@ -116,6 +122,7 @@
//FIBERS //FIBERS
if(A.suit_fibers) if(A.suit_fibers)
user << "\blue Fibers/Materials Data Stored: Scan with Hi-Res Forensic Scanner to retrieve." user << "\blue Fibers/Materials Data Stored: Scan with Hi-Res Forensic Scanner to retrieve."
flick("forensic2",src)
//Blood //Blood
if (A.blood_DNA) if (A.blood_DNA)
@@ -127,11 +134,13 @@
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\ user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\
"You finish scanning \the [A].",\ "You finish scanning \the [A].",\
"You hear a faint hum of electrical equipment.") "You hear a faint hum of electrical equipment.")
flick("forensic2",src)
return 0 return 0
else else
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]\n[user.gender == MALE ? "He" : "She"] seems to perk up slightly at the readout." ,\ user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]\n[user.gender == MALE ? "He" : "She"] seems to perk up slightly at the readout." ,\
"The results of the scan pique your interest.",\ "The results of the scan pique your interest.",\
"You hear a faint hum of electrical equipment, and someone making a thoughtful noise.") "You hear a faint hum of electrical equipment, and someone making a thoughtful noise.")
flick("forensic2",src)
return 0 return 0
return return

View File

@@ -45,7 +45,7 @@
if(istype(tmob, /mob/living/carbon/human)) if(istype(tmob, /mob/living/carbon/human))
for(var/mob/M in range(tmob, 1)) for(var/mob/M in range(tmob, 1))
if( ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) ) if(tmob.pinned.len || ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) )
if ( !(world.time % 5) ) if ( !(world.time % 5) )
src << "\red [tmob] is restrained, you cannot push past" src << "\red [tmob] is restrained, you cannot push past"
now_pushing = 0 now_pushing = 0
@@ -1119,50 +1119,79 @@
del(feet_blood_DNA) del(feet_blood_DNA)
return 1 return 1
/mob/living/carbon/human/verb/yank_out_object() mob/living/carbon/human/yank_out_object()
set category = "Object"
set name = "Yank out object" set name = "Yank out object"
set desc = "Remove an embedded item at the cost of bleeding and pain." set desc = "Remove an embedded item at the cost of bleeding and pain."
set category = "Object" set src in view(1)
if(!isliving(usr) || usr.next_move > world.time) if(!isliving(usr) || usr.next_move > world.time)
return return
usr.next_move = world.time + 20 usr.next_move = world.time + 20
var/list/valid_objects = get_visible_implants(1) if(usr.stat == 1)
usr << "You are unconcious and cannot do that!"
return
if(usr.restrained())
usr << "You are restrained and cannot do that!"
return
var/list/valid_objects = list()
var/datum/organ/external/affected = null var/datum/organ/external/affected = null
var/mob/living/carbon/human/S = src
var/mob/living/carbon/human/U = usr
var/self = null
if(S == U)
self = 1 // Removing object from yourself.
valid_objects = get_visible_implants(1)
if(!valid_objects.len) if(!valid_objects.len)
src << "You have nothing stuck in your wounds that is large enough to remove without surgery." if(self)
return src << "You have nothing stuck in your wounds that is large enough to remove without surgery."
else
if(src.stat == 1) U << "[src] has nothing stuck in their wounds that is large enough to remove without surgery."
src << "You are unconcious and cannot do that!"
return
if(src.restrained())
src << "You are restrained and cannot do that!"
return return
var/obj/item/weapon/selection = input("What do you want to yank out?", "Embedded objects") in valid_objects var/obj/item/weapon/selection = input("What do you want to yank out?", "Embedded objects") in valid_objects
for(var/datum/organ/external/organ in src.organs) //Grab the organ holding the implant. Messy as Hell, TBD: fix. for(var/datum/organ/external/organ in organs) //Grab the organ holding the implant.
for(var/obj/item/weapon/O in organ.implants) for(var/obj/item/weapon/O in organ.implants)
if(O == selection) if(O == selection)
affected = organ affected = organ
if(self)
src << "<span class='warning'>You attempt to get a good grip on the [selection] in your [affected] with bloody fingers.</span>"
else
U << "<span class='warning'>You attempt to get a good grip on the [selection] in [S]'s [affected] with bloody fingers.</span>"
src << "<span class='warning'>You attempt to get a good grip on the [selection] in your [affected] with bloody fingers.</span>" if(istype(U,/mob/living/carbon/human/)) U.bloody_hands(S)
bloody_hands(src)
spawn(80) if(!do_after(U, 80))
return
if(!selection || !affected || !S || !U)
return
if(self)
visible_message("<span class='warning'><b>[src] rips [selection] out of their [affected] in a welter of blood.</b></span>","<span class='warning'><b>You rip [selection] out of your [affected] in a welter of blood.</b></span>") visible_message("<span class='warning'><b>[src] rips [selection] out of their [affected] in a welter of blood.</b></span>","<span class='warning'><b>You rip [selection] out of your [affected] in a welter of blood.</b></span>")
selection.loc = get_turf(src) else
affected.implants -= selection visible_message("<span class='warning'><b>[usr] rips [selection] out of [src]'s [affected] in a welter of blood.</b></span>","<span class='warning'><b>[src] rips [selection] out of your [affected] in a welter of blood.</b></span>")
shock_stage+=10
if(prob(10)) //I'M SO ANEMIC I COULD JUST -DIE-. selection.loc = get_turf(src)
var/datum/wound/internal_bleeding/I = new (15) affected.implants -= selection
affected.wounds += I shock_stage+=10
src.custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 1)
for(var/obj/item/weapon/O in pinned)
if(O == selection)
pinned -= O
if(!pinned.len)
anchored = 0
if(prob(10)) //I'M SO ANEMIC I COULD JUST -DIE-.
var/datum/wound/internal_bleeding/I = new (15)
affected.wounds += I
custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 1)
return 1 return 1
/mob/living/carbon/human/proc/get_visible_implants(var/class = 0) /mob/living/carbon/human/proc/get_visible_implants(var/class = 0)

View File

@@ -226,15 +226,22 @@
//Embedded projectile code. //Embedded projectile code.
if(!organ) return if(!organ) return
if(istype(used_weapon,/obj/item/weapon)) if(istype(used_weapon,/obj/item/weapon))
var/obj/item/weapon/W = used_weapon var/obj/item/weapon/W = used_weapon //Sharp objects will always embed if they do enough damage.
if(damage > (5*W.w_class) && (prob(damage/W.w_class) || sharp)) //The larger it is, the harder it needs to hit to stick. if(damage > (5*W.w_class) && (prob(damage/W.w_class) || sharp)) //The larger it is, the harder it needs to hit to stick.
W.loc = src //Sharp objects will always embed if they do enough damage.
organ.implants += W organ.implants += W
visible_message("<span class='danger'>\The [W] sticks in the wound!</span>") visible_message("<span class='danger'>\The [W] sticks in the wound!</span>")
W.add_blood(src) W.add_blood(src)
if(ismob(W.loc))
var/mob/living/H = W.loc
H.drop_item()
W.loc = src
else if(istype(used_weapon,/obj/item/projectile)) //We don't want to use the actual projectile item, so we spawn some shrapnel. else if(istype(used_weapon,/obj/item/projectile)) //We don't want to use the actual projectile item, so we spawn some shrapnel.
if(prob(50) && damagetype == BRUTE) if(prob(50) && damagetype == BRUTE)
var/obj/item/projectile/P = used_weapon
var/obj/item/weapon/shard/shrapnel/S = new() var/obj/item/weapon/shard/shrapnel/S = new()
S.name = "[P.name] shrapnel"
S.desc = "[S.desc] It looks like it was fired from [P.shot_from]."
S.loc = src S.loc = src
organ.implants += S organ.implants += S
visible_message("<span class='danger'>The projectile sticks in the wound!</span>") visible_message("<span class='danger'>The projectile sticks in the wound!</span>")

View File

@@ -470,7 +470,7 @@
reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
toxins_alert = max(toxins_alert, 1) toxins_alert = max(toxins_alert, 1)
else if(O2_pp > vox_oxygen_max && src.dna.mutantrace=="vox") //Oxygen is toxic to vox. else if(O2_pp > vox_oxygen_max && src.dna.mutantrace=="vox") //Oxygen is toxic to vox.
var/ratio = (breath.oxygen/vox_oxygen_max) * 10 var/ratio = (breath.oxygen/vox_oxygen_max) * 1000
adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
toxins_alert = max(toxins_alert, 1) toxins_alert = max(toxins_alert, 1)
else else
@@ -490,7 +490,7 @@
if( (abs(310.15 - breath.temperature) > 50) && !(COLD_RESISTANCE in mutations)) // Hot air hurts :( if( (abs(310.15 - breath.temperature) > 50) && !(COLD_RESISTANCE in mutations)) // Hot air hurts :(
if(status_flags & GODMODE) return 1 //godmode if(status_flags & GODMODE) return 1 //godmode
if(breath.temperature < 260.15) if(breath.temperature < 260.15 && dna.mutantrace != "vox") //Vox are resistant to cold.
if(prob(20)) if(prob(20))
src << "\red You feel your face freezing and an icicle forming in your lungs!" src << "\red You feel your face freezing and an icicle forming in your lungs!"
else if(breath.temperature > 360.15) else if(breath.temperature > 360.15)
@@ -501,10 +501,10 @@
if(-INFINITY to 120) if(-INFINITY to 120)
apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold") apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold")
fire_alert = max(fire_alert, 1) fire_alert = max(fire_alert, 1)
if(120 to 200) if(120 to 200 && dna.mutantrace != "vox") //Vox are resistant to cold.
apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Cold") apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Cold")
fire_alert = max(fire_alert, 1) fire_alert = max(fire_alert, 1)
if(200 to 260) if(200 to 260 && dna.mutantrace != "vox") //Vox are resistant to cold.
apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Cold") apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Cold")
fire_alert = max(fire_alert, 1) fire_alert = max(fire_alert, 1)
if(360 to 400) if(360 to 400)
@@ -602,7 +602,7 @@
if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE) if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE)
pressure_alert = -1 pressure_alert = -1
else else
if( !(COLD_RESISTANCE in mutations) && src.dna.mutantrace!="vox") if( !(COLD_RESISTANCE in mutations) && src.dna.mutantrace!="vox") //Vox are resistant to pressure loss.
adjustBruteLoss( LOW_PRESSURE_DAMAGE ) adjustBruteLoss( LOW_PRESSURE_DAMAGE )
pressure_alert = -2 pressure_alert = -2
else else

View File

@@ -444,21 +444,36 @@
if(!reagents.has_reagent("inaprovaline")) if(!reagents.has_reagent("inaprovaline"))
adjustOxyLoss(1) adjustOxyLoss(1)
Paralyse(3) Paralyse(3)
if(halloss > 100)
src << "<span class='notice'>You're in too much pain to keep going...</span>"
for(var/mob/O in oviewers(src, null))
O.show_message("<B>[src]</B> slumps to the ground, too weak to continue fighting.", 1)
Paralyse(10)
setHalLoss(99)
if(paralysis) if(paralysis)
AdjustParalysis(-1) AdjustParalysis(-1)
blinded = 1 blinded = 1
stat = UNCONSCIOUS stat = UNCONSCIOUS
if(halloss > 0)
adjustHalLoss(-6)
else if(sleeping) else if(sleeping)
handle_dreams()
adjustHalLoss(-6)
sleeping = max(sleeping-1, 0) sleeping = max(sleeping-1, 0)
blinded = 1 blinded = 1
stat = UNCONSCIOUS stat = UNCONSCIOUS
if( prob(10) && health ) if( prob(10) && health && !hal_crit )
spawn(0) spawn(0)
emote("snore") emote("snore")
else if(resting)
if(halloss > 0)
adjustHalLoss(-6)
//CONSCIOUS //CONSCIOUS
else else
stat = CONSCIOUS stat = CONSCIOUS
if(halloss > 0)
adjustHalLoss(-2)
//Eyes //Eyes
if(sdisabilities & BLIND) //disabled-blind, doesn't get better on its own if(sdisabilities & BLIND) //disabled-blind, doesn't get better on its own

View File

@@ -28,7 +28,7 @@
return 1 return 1
/mob/living/proc/apply_damages(var/brute = 0, var/burn = 0, var/tox = 0, var/oxy = 0, var/clone = 0, var/def_zone = null, var/blocked = 0, var/halloss = 0) /mob/living/proc/apply_damages(var/brute = 0, var/burn = 0, var/tox = 0, var/oxy = 0, var/clone = 0, var/halloss = 0, var/def_zone = null, var/blocked = 0)
if(blocked >= 2) return 0 if(blocked >= 2) return 0
if(brute) apply_damage(brute, BRUTE, def_zone, blocked) if(brute) apply_damage(brute, BRUTE, def_zone, blocked)
if(burn) apply_damage(burn, BURN, def_zone, blocked) if(burn) apply_damage(burn, BURN, def_zone, blocked)
@@ -64,7 +64,7 @@
return 1 return 1
/mob/living/proc/apply_effects(var/stun = 0, var/weaken = 0, var/paralyze = 0, var/irradiate = 0, var/stutter = 0, var/eyeblur = 0, var/drowsy = 0, var/blocked = 0, var/agony = 0) /mob/living/proc/apply_effects(var/stun = 0, var/weaken = 0, var/paralyze = 0, var/irradiate = 0, var/stutter = 0, var/eyeblur = 0, var/drowsy = 0, var/agony = 0, var/blocked = 0)
if(blocked >= 2) return 0 if(blocked >= 2) return 0
if(stun) apply_effect(stun, STUN, blocked) if(stun) apply_effect(stun, STUN, blocked)
if(weaken) apply_effect(weaken, WEAKEN, blocked) if(weaken) apply_effect(weaken, WEAKEN, blocked)

View File

@@ -61,7 +61,7 @@
P.on_hit(src, absorb) P.on_hit(src, absorb)
return absorb return absorb
/mob/living/hitby(atom/movable/AM as mob|obj,var/speed)//Standardization and logging -Sieve /mob/living/hitby(atom/movable/AM as mob|obj,var/speed = 5)//Standardization and logging -Sieve
if(istype(AM,/obj/)) if(istype(AM,/obj/))
var/obj/O = AM var/obj/O = AM
var/zone = ran_zone("chest",75)//Hits a random part of the body, geared towards the chest var/zone = ran_zone("chest",75)//Hits a random part of the body, geared towards the chest
@@ -73,11 +73,49 @@
var/armor = run_armor_check(zone, "melee", "Your armor has protected your [zone].", "Your armor has softened hit to your [zone].") var/armor = run_armor_check(zone, "melee", "Your armor has protected your [zone].", "Your armor has softened hit to your [zone].")
if(armor < 2) if(armor < 2)
apply_damage(O.throwforce*(speed/5), dtype, zone, armor, O.sharp, O) apply_damage(O.throwforce*(speed/5), dtype, zone, armor, O.sharp, O)
if(!O.fingerprintslast) if(!O.fingerprintslast)
return return
var/client/assailant = directory[ckey(O.fingerprintslast)] var/client/assailant = directory[ckey(O.fingerprintslast)]
if(assailant && assailant.mob && istype(assailant.mob,/mob)) if(assailant && assailant.mob && istype(assailant.mob,/mob))
var/mob/M = assailant.mob var/mob/M = assailant.mob
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been hit with [O], last touched by [M.name] ([assailant.ckey])</font>") src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been hit with [O], last touched by [M.name] ([assailant.ckey])</font>")
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Hit [src.name] ([src.ckey]) with [O]</font>") M.attack_log += text("\[[time_stamp()]\] <font color='red'>Hit [src.name] ([src.ckey]) with [O]</font>")
log_attack("<font color='red'>[src.name] ([src.ckey]) was hit by [O], last touched by [M.name] ([assailant.ckey])</font>") log_attack("<font color='red'>[src.name] ([src.ckey]) was hit by [O], last touched by [M.name] ([assailant.ckey])</font>")
// Begin BS12 momentum-transfer code.
if(speed >= 20)
var/obj/item/weapon/W = O
var/momentum = speed/2
var/dir = get_dir(M,src)
visible_message("\red [src] staggers under the impact!","\red You stagger under the impact!")
src.throw_at(get_edge_target_turf(src,dir),1,momentum)
if(near_wall(dir,2) && W.w_class >= 3 && W.sharp) //If they're close to a wall and the projectile is suitable.
visible_message("<span class='warning'>[src] is pinned to the wall by [O]!</span>","<span class='warning'>You are pinned to the wall by [O]!</span>")
if(!istype(src,/mob/living/carbon/human))
O.loc = src
src.embedded += O
src.anchored = 1
src.pinned += O
else
src.anchored = 1
src.pinned += O
/mob/living/proc/near_wall(var/direction,var/distance=1)
var/turf/T = get_step(get_turf(src),direction)
var/i = 1
while(i>0 && i<=distance)
if(T.density) //Turf is a wall!
return 1
i++
T = get_step(T,direction)
return 0
// End BS12 momentum-transfer code.

View File

@@ -24,7 +24,6 @@
//Allows mobs to move through dense areas without restriction. For instance, in space or out of holder objects. //Allows mobs to move through dense areas without restriction. For instance, in space or out of holder objects.
var/incorporeal_move = 0 //0 is off, 1 is normal, 2 is for ninjas. var/incorporeal_move = 0 //0 is off, 1 is normal, 2 is for ninjas.
var/t_plasma = null var/t_plasma = null
var/t_oxygen = null var/t_oxygen = null
var/t_sl_gas = null var/t_sl_gas = null

View File

@@ -96,7 +96,7 @@
AdjustParalysis(-1) AdjustParalysis(-1)
//Movement //Movement
if(!client && !stop_automated_movement && wander) if(!client && !stop_automated_movement && wander && !anchored)
if(isturf(src.loc) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc. if(isturf(src.loc) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc.
turns_since_move++ turns_since_move++
if(turns_since_move >= turns_per_move) if(turns_since_move >= turns_per_move)

View File

@@ -0,0 +1,161 @@
/mob/living/simple_animal/vox/armalis/
name = "serpentine alien"
real_name = "serpentine alien"
desc = "A one-eyed, serpentine creature, half-machine, easily nine feet from tail to beak!"
icon = 'icons/mob/vox.dmi'
icon_state = "armalis"
icon_living = "armalis"
maxHealth = 500
health = 500
response_harm = "slashes at the"
harm_intent_damage = 0
melee_damage_lower = 30
melee_damage_upper = 40
attacktext = "slammed its enormous claws into"
speed = -1
wall_smash = 1
attack_sound = 'sound/weapons/bladeslice.ogg'
status_flags = 0
universal_speak = 1
vox_talk_understand = 1
var/armour = null
var/amp = null
var/quills = 3
/mob/living/simple_animal/vox/armalis/Die()
living_mob_list -= src
dead_mob_list += src
stat = DEAD
visible_message("\red <B>[src] shudders violently and explodes!</B>","\red <B>You feel your body rupture!</B>")
explosion(get_turf(loc), -1, -1, 3, 5)
src.gib()
return
/mob/living/simple_animal/vox/armalis/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(O.force)
if(O.force >= 25)
var/damage = O.force
if (O.damtype == HALLOSS)
damage = 0
health -= damage
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
M.show_message("\red \b [src] has been attacked with the [O] by [user]. ")
else
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
M.show_message("\red \b The [O] bounces harmlessly off of [src]. ")
else
usr << "\red This weapon is ineffective, it does no damage."
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
M.show_message("\red [user] gently taps [src] with the [O]. ")
/mob/living/simple_animal/vox/armalis/verb/fire_quill(mob/target as mob in oview())
set name = "Fire quill"
set desc = "Fires a viciously pointed quill at a high speed."
set category = "Alien"
if(quills<=0)
return
src << "\red You launch a razor-sharp quill at [target]!"
for(var/mob/O in oviewers())
if ((O.client && !( O.blinded )))
O << "\red [src] launches a razor-sharp quill at [target]!"
var/obj/item/weapon/arrow/quill/Q = new(loc)
Q.fingerprintslast = src.ckey
Q.throw_at(target,10,20)
quills--
spawn(100)
src << "\red You feel a fresh quill slide into place."
quills++
/mob/living/simple_animal/vox/armalis/verb/message_mob()
set category = "Alien"
set name = "Commune with creature"
set desc = "Send a telepathic message to an unlucky recipient."
var/list/targets = list()
var/target = null
var/text = null
targets += getmobs() //Fill list, prompt user with list
target = input("Select a creature!", "Speak to creature", null, null) as null|anything in targets
text = input("What would you like to say?", "Speak to creature", null, null)
if (!target || !text)
return
var/mob/M = targets[target]
if(istype(M, /mob/dead/observer) || M.stat == DEAD)
src << "Not even the armalis can speak to the dead."
return
M << "\blue Like lead slabs crashing into the ocean, alien thoughts drop into your mind: [text]"
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(H.dna.mutantrace == "vox")
return
H << "\red Your nose begins to bleed..."
H.drip(1)
/mob/living/simple_animal/vox/armalis/verb/shriek()
set category = "Alien"
set name = "Shriek"
set desc = "Give voice to a psychic shriek."
/mob/living/simple_animal/vox/armalis/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(istype(O,/obj/item/vox/armalis_armour))
user.drop_item()
armour = O
speed = 1
maxHealth += 200
health += 200
O.loc = src
visible_message("\blue [src] is quickly outfitted in [O] by [user].","\blue You quickly outfit [src] in [O].")
regenerate_icons()
return
if(istype(O,/obj/item/vox/armalis_amp))
user.drop_item()
amp = O
O.loc = src
visible_message("\blue [src] is quickly outfitted in [O] by [user].","\blue You quickly outfit [src] in [O].")
regenerate_icons()
return
return ..()
/mob/living/simple_animal/vox/armalis/regenerate_icons()
overlays = list()
if(armour)
var/icon/armour = image('icons/mob/vox.dmi',"armour")
speed = 1
overlays += armour
if(amp)
var/icon/amp = image('icons/mob/vox.dmi',"amplifier")
overlays += amp
return
/obj/item/vox/armalis_armour
name = "strange armour"
desc = "Hulking reinforced armour for something huge."
icon = 'icons/obj/clothing/suits.dmi'
icon_state = "armalis_armour"
item_state = "armalis_armour"
/obj/item/vox/armalis_amp
name = "strange lenses"
desc = "A series of metallic lenses and chains."
icon = 'icons/obj/clothing/hats.dmi'
icon_state = "amp"
item_state = "amp"

View File

@@ -583,24 +583,29 @@ var/list/slot_equipment_priority = list( \
pulling = null pulling = null
/mob/proc/start_pulling(var/atom/movable/AM) /mob/proc/start_pulling(var/atom/movable/AM)
if ( !AM || !usr || src==AM || !isturf(src.loc) ) //if there's no person pulling OR the person is pulling themself OR the object being pulled is inside something: abort! if ( !AM || !usr || src==AM || !isturf(src.loc) ) //if there's no person pulling OR the person is pulling themself OR the object being pulled is inside something: abort!
return return
if (!( AM.anchored ))
if(pulling)
var/pulling_old = pulling
stop_pulling()
// Are we pulling the same thing twice? Just stop pulling.
if(pulling_old == AM)
return
src.pulling = AM
AM.pulledby = src
if(ismob(AM))
var/mob/M = AM
if(!iscarbon(src))
M.LAssailant = null
else
M.LAssailant = usr
if (AM.anchored)
return
var/mob/M = AM
if(ismob(AM))
if(!iscarbon(src))
M.LAssailant = null
else
M.LAssailant = usr
return
if(pulling)
var/pulling_old = pulling
stop_pulling()
// Are we pulling the same thing twice? Just stop pulling.
if(pulling_old == AM)
return
src.pulling = AM
AM.pulledby = src
/mob/proc/can_use_hands() /mob/proc/can_use_hands()
return return
@@ -888,3 +893,66 @@ note dizziness decrements automatically in the mob's Life() proc.
/mob/proc/flash_weak_pain() /mob/proc/flash_weak_pain()
flick("weak_pain",pain) flick("weak_pain",pain)
mob/verb/yank_out_object()
set category = "Object"
set name = "Yank out object"
set desc = "Remove an embedded item at the cost of bleeding and pain."
set src in view(1)
if(!isliving(usr) || usr.next_move > world.time)
return
usr.next_move = world.time + 20
if(usr.stat == 1)
usr << "You are unconcious and cannot do that!"
return
if(usr.restrained())
usr << "You are restrained and cannot do that!"
return
var/mob/S = src
var/mob/U = usr
var/list/valid_objects = list()
var/self = null
if(S == U)
self = 1 // Removing object from yourself.
for(var/obj/item/weapon/W in embedded)
if(W.w_class >= 2)
valid_objects += W
if(!valid_objects.len)
if(self)
src << "You have nothing stuck in your body that is large enough to remove."
else
U << "[src] has nothing stuck in their wounds that is large enough to remove."
return
var/obj/item/weapon/selection = input("What do you want to yank out?", "Embedded objects") in valid_objects
if(self)
src << "<span class='warning'>You attempt to get a good grip on the [selection] in your body.</span>"
else
U << "<span class='warning'>You attempt to get a good grip on the [selection] in [S]'s body.</span>"
if(!do_after(U, 80))
return
if(!selection || !S || !U)
return
if(self)
visible_message("<span class='warning'><b>[src] rips [selection] out of their body.</b></span>","<span class='warning'><b>You rip [selection] out of your body.</b></span>")
else
visible_message("<span class='warning'><b>[usr] rips [selection] out of [src]'s body.</b></span>","<span class='warning'><b>[src] rips [selection] out of your body.</b></span>")
selection.loc = get_turf(src)
for(var/obj/item/weapon/O in pinned)
if(O == selection)
pinned -= O
if(!pinned.len)
anchored = 0
return 1

View File

@@ -85,6 +85,8 @@
var/lastpuke = 0 var/lastpuke = 0
var/unacidable = 0 var/unacidable = 0
var/small = 0 var/small = 0
var/list/pinned = list() //List of things pinning this creature to walls (see living_defense.dm)
var/list/embedded = list() //Embedded items, since simple mobs don't have organs.
var/name_archive //For admin things like possession var/name_archive //For admin things like possession

View File

@@ -256,7 +256,6 @@
if(!mob.canmove) return if(!mob.canmove) return
//if(istype(mob.loc, /turf/space) || (mob.flags & NOGRAV)) //if(istype(mob.loc, /turf/space) || (mob.flags & NOGRAV))
// if(!mob.Process_Spacemove(0)) return 0 // if(!mob.Process_Spacemove(0)) return 0
@@ -279,6 +278,10 @@
src << "\blue You're restrained! You can't move!" src << "\blue You're restrained! You can't move!"
return 0 return 0
if(mob.pinned.len)
src << "\blue You're pinned to a wall by [mob.pinned[1]]!"
return 0
move_delay = world.time//set move delay move_delay = world.time//set move delay
mob.last_move_intent = world.time + 10 mob.last_move_intent = world.time + 10
switch(mob.m_intent) switch(mob.m_intent)

View File

@@ -314,8 +314,10 @@
if(emergency_shuttle) //In case Nanotrasen decides reposess CentComm's shuttles. if(emergency_shuttle) //In case Nanotrasen decides reposess CentComm's shuttles.
if(emergency_shuttle.direction == 2) //Shuttle is going to centcomm, not recalled if(emergency_shuttle.direction == 2) //Shuttle is going to centcomm, not recalled
dat += "<font color='red'><b>The station has been evacuated.</b></font><br>" dat += "<font color='red'><b>The station has been evacuated.</b></font><br>"
if(emergency_shuttle.direction == 1 && emergency_shuttle.timeleft() < 300) //Shuttle is past the point of no recall if(emergency_shuttle.direction == 1 && emergency_shuttle.timeleft() < 300 && emergency_shuttle.alert == 0) // Emergency shuttle is past the point of no recall
dat += "<font color='red'>The station is currently undergoing evacuation procedures.</font><br>" dat += "<font color='red'>The station is currently undergoing evacuation procedures.</font><br>"
if(emergency_shuttle.direction == 1 && emergency_shuttle.alert == 1) // Crew transfer initiated
dat += "<font color='red'>The station is currently undergoing crew transfer procedures.</font><br>"
dat += "Choose from the following open positions:<br>" dat += "Choose from the following open positions:<br>"
for(var/datum/job/job in job_master.occupations) for(var/datum/job/job in job_master.occupations)
@@ -349,12 +351,8 @@
if(is_alien_whitelisted(src, "Skrell"|| !config.usealienwhitelist)) if(is_alien_whitelisted(src, "Skrell"|| !config.usealienwhitelist))
new_character.dna.mutantrace = "skrell" new_character.dna.mutantrace = "skrell"
new_character.skrell_talk_understand = 1 new_character.skrell_talk_understand = 1
if(client.prefs.species == "Vox")
if(is_alien_whitelisted(src, "Vox"|| !config.usealienwhitelist))
new_character.dna.mutantrace = "vox"
new_character.vox_talk_understand = 1
if(client.prefs.species == "Kidan") if(client.prefs.species == "Kidan")
if(is_alien_whitelisted(src, "Vox"|| !config.usealienwhitelist)) if(is_alien_whitelisted(src, "Kidan"|| !config.usealienwhitelist))
new_character.dna.mutantrace = "kidan" new_character.dna.mutantrace = "kidan"
new_character.kidan_talk_understand = 1 new_character.kidan_talk_understand = 1

View File

@@ -81,7 +81,7 @@
if (is_speaking_tajaran) if (is_speaking_tajaran)
return "<span class='say_quote'>mrowls</span>, \"<span class='tajaran'>[text]</span>\""; return "<span class='say_quote'>mrowls</span>, \"<span class='tajaran'>[text]</span>\"";
if (is_speaking_vox) if (is_speaking_vox)
return "<span class='say_quote'>chirps</span>, \"<span class='vox'>[text]</span>\""; return "<span class='say_quote'>shrieks</span>, \"<span class='vox'>[text]</span>\"";
if (is_speaking_kidan) if (is_speaking_kidan)
return "<span class='say_quote'>chitters</span>, \"<span class='kidan'>[text]</span>\""; return "<span class='say_quote'>chitters</span>, \"<span class='kidan'>[text]</span>\"";
//Needs Virus2 //Needs Virus2

View File

@@ -6,13 +6,22 @@
icon_state = "bolt" icon_state = "bolt"
item_state = "bolt" item_state = "bolt"
flags = FPRINT | TABLEPASS flags = FPRINT | TABLEPASS
throwforce = 12 throwforce = 8
w_class = 2.0 w_class = 3.0
sharp = 1 sharp = 1
/obj/item/weapon/arrow/proc/removed() //Helper for metal rods falling apart.. /obj/item/weapon/arrow/proc/removed() //Helper for metal rods falling apart.
return return
/obj/item/weapon/arrow/quill
name = "vox quill"
desc = "A wickedly barbed quill from some bizarre animal."
icon = 'icons/obj/weapons.dmi'
icon_state = "quill"
item_state = "quill"
throwforce = 5
/obj/item/weapon/arrow/rod /obj/item/weapon/arrow/rod
name = "metal rod" name = "metal rod"
@@ -20,7 +29,7 @@
icon_state = "metal-rod" icon_state = "metal-rod"
/obj/item/weapon/arrow/rod/removed(mob/user) /obj/item/weapon/arrow/rod/removed(mob/user)
if(throwforce == 20) // The rod has been superheated - we don't want it to be useable when removed from the bow. if(throwforce == 15) // The rod has been superheated - we don't want it to be useable when removed from the bow.
user << "[src] shatters into a scattering of overstressed metal shards as it leaves the crossbow." user << "[src] shatters into a scattering of overstressed metal shards as it leaves the crossbow."
var/obj/item/weapon/shard/shrapnel/S = new() var/obj/item/weapon/shard/shrapnel/S = new()
S.loc = get_turf(src) S.loc = get_turf(src)
@@ -33,7 +42,7 @@
icon = 'icons/obj/weapons.dmi' icon = 'icons/obj/weapons.dmi'
icon_state = "crossbow" icon_state = "crossbow"
item_state = "crossbow-solid" item_state = "crossbow-solid"
w_class = 4.0 w_class = 5.0
flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY
slot_flags = SLOT_BELT | SLOT_BACK slot_flags = SLOT_BELT | SLOT_BACK
@@ -59,14 +68,16 @@
var/obj/item/stack/rods/R = W var/obj/item/stack/rods/R = W
R.use(1) R.use(1)
arrow = new /obj/item/weapon/arrow/rod(src) arrow = new /obj/item/weapon/arrow/rod(src)
arrow.fingerprintslast = src.fingerprintslast
arrow.loc = src arrow.loc = src
icon_state = "crossbow-nocked"
user.visible_message("[user] haphazardly jams [arrow] into [src].","You jam [arrow] into [src].") user.visible_message("[user] haphazardly jams [arrow] into [src].","You jam [arrow] into [src].")
if(cell) if(cell)
if(cell.charge >= 500) if(cell.charge >= 500)
user << "<span class='notice'>[arrow] plinks and crackles as it begins to glow red-hot.</span>" user << "<span class='notice'>[arrow] plinks and crackles as it begins to glow red-hot.</span>"
arrow.throwforce = 20 arrow.throwforce = 15
arrow.icon_state = "metal-rod-superheated" arrow.icon_state = "metal-rod-superheated"
cell.charge -= 500
return return
if(istype(W, /obj/item/weapon/cell)) if(istype(W, /obj/item/weapon/cell))
@@ -78,7 +89,7 @@
if(arrow) if(arrow)
if(istype(arrow,/obj/item/weapon/arrow/rod) && cell.charge >= 500) if(istype(arrow,/obj/item/weapon/arrow/rod) && cell.charge >= 500)
user << "<span class='notice'>[arrow] plinks and crackles as it begins to glow red-hot.</span>" user << "<span class='notice'>[arrow] plinks and crackles as it begins to glow red-hot.</span>"
arrow.throwforce = 20 arrow.throwforce = 15
arrow.icon_state = "metal-rod-superheated" arrow.icon_state = "metal-rod-superheated"
cell.charge -= 500 cell.charge -= 500
else else
@@ -156,6 +167,10 @@
else if(target == user) else if(target == user)
return return
if(!tension)
user << "You haven't drawn back the bolt!"
return 0
if (!arrow) if (!arrow)
user << "You have no arrow nocked to [src]!" user << "You have no arrow nocked to [src]!"
return 0 return 0

View File

@@ -4,7 +4,7 @@
icon = 'icons/obj/gun.dmi' icon = 'icons/obj/gun.dmi'
icon_state = "pneumatic" icon_state = "pneumatic"
item_state = "pneumatic" item_state = "pneumatic"
w_class = 4.0 w_class = 5.0
flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY
slot_flags = SLOT_BELT slot_flags = SLOT_BELT
max_w_class = 3 max_w_class = 3

View File

@@ -57,6 +57,29 @@ Stuff which is in development and not yet visible to players or just code relate
(ie. code improvements for expandability, etc.) should not be listed here. They (ie. code improvements for expandability, etc.) should not be listed here. They
should be listed in the changelog upon commit though. Thanks. --> should be listed in the changelog upon commit though. Thanks. -->
<div class="commit sansserif">
<h2 class="date">18.06.2013</h2>
<h3 class="author">Segrain updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixed some bugs in windoor construction.</li>
<li class="tweak">Secure windoors are made with rods again.</li>
<li class="rscadd">Windoors drop their electronics when broken. Emagged windoors can have theirs removed by crowbar.</li>
<li class="rscadd">Airlock electronics can be configured to make door open for any single access on it instead of all of them.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">13.06.2013</h2>
<h3 class="author">Kilakk updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added the Xenobiologist job. Has access to the research hallway and to xenobiology.</li>
<li class="rscdel">Removed Xenobiology access from Scientists.</li>
<li class="rscdel">Removed the Xenobiologist alternate title from Scientists.</li>
<li class="rscadd">Added "Xenoarchaeology" to the RD, Scientists, and to the ID computer.</li>
<li class="tweak">Changed the Research Outpost doors to use "Xenoarchaeology" access.</li>
</ul>
</div>
<div class="commit sansserif"> <div class="commit sansserif">
<h2 class="date">6-13-13</h2> <h2 class="date">6-13-13</h2>
<h3 class="author">Asanadas updated:</h3> <h3 class="author">Asanadas updated:</h3>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
icons/mob/vox.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 288 KiB

After

Width:  |  Height:  |  Size: 290 KiB

File diff suppressed because it is too large Load Diff