Merge branch 'bleeding-edge-freeze' of github.com:Baystation12/Baystation12 into feature

Conflicts:
	code/ZAS/ZAS_Zones.dm
	code/game/gamemodes/events.dm
This commit is contained in:
cib
2012-12-16 15:10:04 +01:00
50 changed files with 645 additions and 158 deletions

View File

@@ -397,6 +397,7 @@
#include "code\defines\procs\icon_procs_readme.dm"
#include "code\defines\procs\logging.dm"
#include "code\defines\procs\religion_name.dm"
#include "code\defines\procs\sd_Alert.dm"
#include "code\defines\procs\station_name.dm"
#include "code\defines\procs\statistics.dm"
#include "code\defines\procs\syndicate_name.dm"

View File

@@ -133,15 +133,16 @@ proc/Airflow(zone/A, zone/B)
else
connected_turfs |= C.B
//Get lists of things that can be thrown across the room for each zone.
var/list/pplz = B.movables()
var/list/otherpplz = A.movables()
//Get lists of things that can be thrown across the room for each zone (assumes air is moving from zone B to zone A)
var/list/air_sucked = B.movables()
var/list/air_repelled = A.movables()
if(n < 0)
var/list/temporary_pplz = pplz
pplz = otherpplz
otherpplz = temporary_pplz
//air is moving from zone A to zone B
var/list/temporary_pplz = air_sucked
air_sucked = air_repelled
air_repelled = temporary_pplz
for(var/atom/movable/M in pplz)
for(var/atom/movable/M in air_sucked)
if(M.last_airflow > world.time - vsc.airflow_delay) continue
@@ -166,7 +167,7 @@ proc/Airflow(zone/A, zone/B)
spawn M.GotoAirflowDest(abs(n)/5)
//Do it again for the stuff in the other zone, making it fly away.
for(var/atom/movable/M in otherpplz)
for(var/atom/movable/M in air_repelled)
if(M.last_airflow > world.time - vsc.airflow_delay) continue
@@ -240,12 +241,15 @@ atom/movable
if(airflow_dest == loc)
step_away(src,loc)
if(ismob(src))
if(src:nodamage) return
if(src:nodamage)
return
if(istype(src, /mob/living/carbon/human))
if(istype(src, /mob/living/carbon/human))
if(src:buckled) return
if(src:shoes)
if(src:shoes.type == /obj/item/clothing/shoes/magboots && src:shoes.flags & NOSLIP) return
if(src:buckled)
return
if(src:shoes)
if(src:shoes.type == /obj/item/clothing/shoes/magboots)
if(src:shoes.flags & NOSLIP)
return
src << "\red You are sucked away by airflow!"
var/airflow_falloff = 9 - ul_FalloffAmount(airflow_dest) //It's a fast falloff calc. Very useful.
if(airflow_falloff < 1)
@@ -266,9 +270,15 @@ atom/movable
airflow_speed -= vsc.airflow_speed_decay
if(airflow_speed > 7)
if(airflow_time++ >= airflow_speed - 7)
if(od)
density = 0
sleep(1 * tick_multiplier)
else
if(od)
density = 0
sleep(max(1,10-(airflow_speed+3)) * tick_multiplier)
if(od)
density = 1
if ((!( src.airflow_dest ) || src.loc == src.airflow_dest))
src.airflow_dest = locate(min(max(src.x + xo, 1), world.maxx), min(max(src.y + yo, 1), world.maxy), src.z)
if ((src.x == 1 || src.x == world.maxx || src.y == 1 || src.y == world.maxy))
@@ -276,7 +286,8 @@ atom/movable
if(!istype(loc, /turf))
return
step_towards(src, src.airflow_dest)
if(ismob(src) && src:client) src:client:move_delay = world.time + vsc.airflow_mob_slowdown
if(ismob(src) && src:client)
src:client:move_delay = world.time + vsc.airflow_mob_slowdown
airflow_dest = null
airflow_speed = 0
airflow_time = 0
@@ -295,12 +306,15 @@ atom/movable
if(airflow_dest == loc)
step_away(src,loc)
if(ismob(src))
if(src:nodamage) return
if(src:nodamage)
return
if(istype(src, /mob/living/carbon/human))
if(istype(src, /mob/living/carbon/human))
if(src:buckled) return
if(src:shoes)
if(src:shoes.type == /obj/item/clothing/shoes/magboots && src:shoes.flags & NOSLIP) return
if(src:buckled)
return
if(src:shoes)
if(src:shoes.type == /obj/item/clothing/shoes/magboots)
if(src:shoes.flags & NOSLIP)
return
src << "\red You are pushed away by airflow!"
var/airflow_falloff = 9 - ul_FalloffAmount(airflow_dest) //It's a fast falloff calc. Very useful.
if(airflow_falloff < 1)
@@ -331,7 +345,8 @@ atom/movable
if(!istype(loc, /turf))
return
step_towards(src, src.airflow_dest)
if(ismob(src) && src:client) src:client:move_delay = world.time + vsc.airflow_mob_slowdown
if(ismob(src) && src:client)
src:client:move_delay = world.time + vsc.airflow_mob_slowdown
airflow_dest = null
airflow_speed = 0
airflow_time = 0

View File

@@ -36,7 +36,7 @@ zone
if(!istype(T,/turf/simulated))
AddTurf(T)
//Generate the gas_mixture for use in this zone by using the average of the gases
//Generate the gas_mixture for use in txhis zone by using the average of the gases
//defined at startup.
air = new
var/members = contents.len
@@ -304,6 +304,13 @@ proc/ShareRatio(datum/gas_mixture/A, datum/gas_mixture/B, connecting_tiles)
temp_avg = (A.temperature * full_heat_capacity + B.temperature * s_full_heat_capacity) / (full_heat_capacity + s_full_heat_capacity)
<<<<<<< HEAD
=======
if(sharing_lookup_table.len >= connecting_tiles) //6 or more interconnecting tiles will max at 42% of air moved per tick.
ratio = sharing_lookup_table[connecting_tiles]
ratio *= 3
>>>>>>> bc318a3c8e40f9a2eed179318e17f56ce828ab1e
A.oxygen = max(0, (A.oxygen - oxy_avg) * (1-ratio) + oxy_avg )
A.nitrogen = max(0, (A.nitrogen - nit_avg) * (1-ratio) + nit_avg )
A.carbon_dioxide = max(0, (A.carbon_dioxide - co2_avg) * (1-ratio) + co2_avg )
@@ -366,17 +373,30 @@ proc/ShareSpace(datum/gas_mixture/A, list/unsimulated_tiles)
size = max(1,A.group_multiplier)
share_size = max(1,unsimulated_tiles.len)
full_oxy = A.oxygen * size
full_nitro = A.nitrogen * size
full_co2 = A.carbon_dioxide * size
full_plasma = A.toxins * size
//full_oxy = A.oxygen * size
//full_nitro = A.nitrogen * size
//full_co2 = A.carbon_dioxide * size
//full_plasma = A.toxins * size
full_heat_capacity = A.heat_capacity() * size
//full_heat_capacity = A.heat_capacity() * size
<<<<<<< HEAD
oxy_avg = (full_oxy + unsim_oxygen * 4) / (size + share_size * 4)
nit_avg = (full_nitro + unsim_nitrogen * 4) / (size + share_size * 4)
co2_avg = (full_co2 + unsim_co2 * 4) / (size + share_size * 4)
plasma_avg = (full_plasma + unsim_plasma * 4) / (size + share_size * 4)
=======
oxy_avg = unsim_oxygen//(full_oxy + unsim_oxygen) / (size + share_size)
nit_avg = unsim_nitrogen//(full_nitro + unsim_nitrogen) / (size + share_size)
co2_avg = unsim_co2//(full_co2 + unsim_co2) / (size + share_size)
plasma_avg = unsim_plasma//(full_plasma + unsim_plasma) / (size + share_size)
temp_avg = unsim_temperature//(A.temperature * full_heat_capacity + unsim_temperature * unsim_heat_capacity) / (full_heat_capacity + unsim_heat_capacity)
if(sharing_lookup_table.len >= unsimulated_tiles.len) //6 or more interconnecting tiles will max at 42% of air moved per tick.
ratio = sharing_lookup_table[unsimulated_tiles.len]
ratio *= 3
>>>>>>> bc318a3c8e40f9a2eed179318e17f56ce828ab1e
A.oxygen = max(0, (A.oxygen - oxy_avg) * (1-ratio) + oxy_avg )
A.nitrogen = max(0, (A.nitrogen - nit_avg) * (1-ratio) + nit_avg )

View File

@@ -288,6 +288,13 @@ datum/shuttle_controller
if(1)
// Just before it leaves, close the damn doors!
if(timeleft == 2 || timeleft == 1)
var/area/start_location = locate(/area/shuttle/escape/station)
for(var/obj/machinery/door/D in start_location)
spawn(0)
D.close()
if(timeleft>0)
return 0

View File

@@ -10,6 +10,7 @@ var/global/list/client_list = list() //List of all clients, based on ckey
var/global/list/cable_list = list() //Index for all cables, so that powernets don't have to look through the entire world all the time
var/global/list/hair_styles_list = list() //stores /datum/sprite_accessory/hair indexed by name
var/global/list/facial_hair_styles_list = list() //stores /datum/sprite_accessory/facial_hair indexed by name
var/global/list/skin_styles_list = list() //stores /datum/sprite_accessory/skin indexed by name
var/global/list/chemical_reactions_list //list of all /datum/chemical_reaction datums. Used during chemical reactions
var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff
var/global/list/landmarks_list = list() //list of all landmarks created
@@ -26,12 +27,21 @@ var/global/list/landmarks_list = list() //list of all landmarks created
for(var/path in paths)
var/datum/sprite_accessory/hair/H = new path()
hair_styles_list[H.name] = H
//Facial Hair - Initialise all /datum/sprite_accessory/facial_hair into an list indexed by facialhair-style name
paths = typesof(/datum/sprite_accessory/facial_hair) - /datum/sprite_accessory/facial_hair
for(var/path in paths)
var/datum/sprite_accessory/facial_hair/H = new path()
facial_hair_styles_list[H.name] = H
//Skin Styles - Initialise all /datum/sprite_accessory/skin into a list indexed by the name
//Check to make sure the icon file exists first
paths = typesof(/datum/sprite_accessory/skin) - /datum/sprite_accessory/skin
for(var/path in paths)
var/datum/sprite_accessory/skin/S = new path()
if(fexists("[S.icon].dmi"))
skin_styles_list[S.name] = S
proc/make_player_list()//Global proc that rebuilds the player list
for(var/mob/p in player_list)//Clears out everyone that logged out
if(!(p.client))

View File

@@ -0,0 +1,168 @@
/* sd_Alert library
by Shadowdarke (shadowdarke@byond.com)
sd_Alert() is a powerful and flexible alternative to the built in BYOND
alert() proc. sd_Alert offers timed popups, unlimited buttons, custom
appearance, and even the option to popup without stealing keyboard focus
from the map or command line.
Please see demo.dm for detailed examples.
FORMAT
sd_Alert(who, message, title, buttons, default, duration, unfocus, \
size, table, style, tag, select, flags)
ARGUMENTS
who - the client or mob to display the alert to.
message - text message to display
title - title of the alert box
buttons - list of buttons
Default Value: list("Ok")
default - default button selestion
Default Value: the first button in the list
duration - the number of ticks before this alert expires. If not
set, the alert lasts until a button is clicked.
Default Value: 0 (unlimited)
unfocus - if this value is set, the popup will not steal keyboard
focus from the map or command line.
Default Value: 1 (do not take focus)
size - size of the popup window in px
Default Value: "300x200"
table - optional parameters for the HTML table in the alert
Default Value: "width=100% height=100%" (fill the window)
style - optional style sheet information
tag - lets you specify a certain tag for this sd_Alert so you may manipulate it
externally. (i.e. force the alert to close, change options and redisplay,
reuse the same window, etc.)
select - if set, the buttons will be replaced with a selection box with a number of
lines displayed equal to this value.
Default value: 0 (use buttons)
flags - optional flags effecting the alert display. These flags may be ORed (|)
together for multiple effects.
SD_ALERT_SCROLL = display a scrollbar
SD_ALERT_SELECT_MULTI = forces selection box display (instead of
buttons) allows the user to select multiple
choices.
SD_ALERT_LINKS = display each choice as a plain text link.
Any selection box style overrides this flag.
SD_ALERT_NOVALIDATE = don't validate responses
Default value: SD_ALERT_SCROLL
(button display with scroll bar, validate responses)
RETURNS
The text of the selected button, or null if the alert duration expired
without a button click.
Version 1 changes (from version 0):
* Added the tag, select, and flags arguments, thanks to several suggestions from Foomer.
* Split the sd_Alert/Alert() proc into New(), Display(), and Response() to allow more
customization by developers. Primarily developers would want to use Display() to change
the display of active tagged windows
*/
#define SD_ALERT_SCROLL 1
#define SD_ALERT_SELECT_MULTI 2
#define SD_ALERT_LINKS 4
#define SD_ALERT_NOVALIDATE 8
proc/sd_Alert(client/who, message, title, buttons = list("Ok"),\
default, duration = 0, unfocus = 1, size = "300x200", \
table = "width=100% height=100%", style, tag, select, flags = SD_ALERT_SCROLL)
if(ismob(who))
var/mob/M = who
who = M.client
if(!istype(who)) CRASH("sd_Alert: Invalid target:[who] (\ref[who])")
var/sd_alert/T = locate(tag)
if(T)
if(istype(T)) del(T)
else CRASH("sd_Alert: tag \"[tag]\" is already in use by datum '[T]' (type: [T.type])")
T = new(who, tag)
if(duration)
spawn(duration)
if(T) del(T)
return
T.Display(message,title,buttons,default,unfocus,size,table,style,select,flags)
. = T.Response()
sd_alert
var
client/target
response
list/validation
Del()
target << browse(null,"window=\ref[src]")
..()
New(who, tag)
..()
target = who
src.tag = tag
Topic(href,params[])
if(usr.client != target) return
response = params["clk"]
proc/Display(message,title,list/buttons,default,unfocus,size,table,style,select,flags)
if(unfocus) spawn() target << browse(null,null)
if(istext(buttons)) buttons = list(buttons)
if(!default) default = buttons[1]
if(!(flags & SD_ALERT_NOVALIDATE)) validation = buttons.Copy()
var/html = {"<head><title>[title]</title>[style]<script>\
function c(x) {document.location.href='BYOND://?src=\ref[src];'+x;}\
</script></head><body onLoad="fcs.focus();"\
[(flags&SD_ALERT_SCROLL)?"":" scroll=no"]><table [table]><tr>\
<td>[message]</td></tr><tr><th>"}
if(select || (flags & SD_ALERT_SELECT_MULTI)) // select style choices
html += {"<FORM ID=fcs ACTION='BYOND://?' METHOD=GET>\
<INPUT TYPE=HIDDEN NAME=src VALUE='\ref[src]'>
<SELECT NAME=clk SIZE=[select]\
[(flags & SD_ALERT_SELECT_MULTI)?" MULTIPLE":""]>"}
for(var/b in buttons)
html += "<OPTION[(b == default)?" SELECTED":""]>\
[html_encode(b)]</OPTION>"
html += "</SELECT><BR><INPUT TYPE=SUBMIT VALUE=Submit></FORM>"
else if(flags & SD_ALERT_LINKS) // text link style
for(var/b in buttons)
var/list/L = list()
L["clk"] = b
var/html_string=list2params(L)
var/focus
if(b == default) focus = " ID=fcs"
html += "<A[focus] href=# onClick=\"c('[html_string]')\">[html_encode(b)]</A>\
<BR>"
else // button style choices
for(var/b in buttons)
var/list/L = list()
L["clk"] = b
var/html_string=list2params(L)
var/focus
if(b == default) focus = " ID=fcs"
html += "<INPUT[focus] TYPE=button VALUE='[html_encode(b)]' \
onClick=\"c('[html_string]')\"> "
html += "</th></tr></table></body>"
target << browse(html,"window=\ref[src];size=[size];can_close=0")
proc/Response()
var/validated
while(!validated)
while(target && !response) // wait for a response
sleep(2)
if(response && validation)
if(istype(response, /list))
var/list/L = response - validation
if(L.len) response = null
else validated = 1
else if(response in validation) validated = 1
else response=null
else validated = 1
spawn(2) del(src)
return response

View File

@@ -21,6 +21,9 @@
// Doesn't necessarily trigger an event, but might. Returns 1 if it did.
/proc/event()
event = 1
if(!sent_ninja_to_station)
choose_space_ninja()
return
var/minutes_passed = world.time/600
@@ -50,12 +53,28 @@
possibleEvents["Appendicitis"] = medical_count * 50
if(security_count >= 1)
possibleEvents["Prison Break"] = security_count * 50
possibleEvents["Space Ninja"] = security_count * 10 // very low chance for space ninja event
var/picked_event = pick(possibleEvents)
var/chance = possibleEvents[picked_event]
var/base_chance = 0.4
switch(player_list.len)
if(5 to 10)
base_chance = 0.6
if(11 to 15)
base_chance = 0.7
if(16 to 20)
base_chance = 0.8
if(21 to 25)
base_chance = 0.9
if(26 to 30)
base_chance = 1.0
if(30 to 100000)
base_chance = 1.1
// Trigger the event based on how likely it currently is.
if(!prob(chance * eventchance * player_list.len / 20)) // "normal" event chance at 20 players
if(!prob(chance * eventchance * base_chance)) // "normal" event chance at 20 players
return 0
switch(picked_event)
@@ -70,6 +89,9 @@
spawn_meteors()
if("Blob")
mini_blob_event()
if("Space Ninja")
//Handled in space_ninja.dm. Doesn't announce arrival, all sneaky-like.
choose_space_ninja()
if("Radiation")
high_radiation_event()
if("Virus")

View File

@@ -93,7 +93,33 @@ When I already created about 4 new objectives, this doesn't seem terribly import
/var/global/toggle_space_ninja = 1//If ninjas can spawn or not.
/var/global/sent_ninja_to_station = 0//If a ninja is already on the station.
/proc/space_ninja_arrival()
/proc/choose_space_ninja()
var/list/candidates = list() //list of candidate keys
for(var/mob/dead/observer/G in player_list)
if(G.client && ((G.client.inactivity/10)/60) <= 5 && G.client.be_spaceninja)
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
candidates += G
if(!candidates.len) return
candidates = shuffle(candidates)//Incorporating Donkie's list shuffle
//loop over all viable candidates, giving them a popup asking if they want to be space ninja
var/mob/dead/observer/accepted_ghost
while(candidates.len && !accepted_ghost)
//ask a different random candidate
var/mob/dead/observer/G = pick(candidates)
//give the popup a 30 second timeout in case the player is AFK
if(sd_Alert(G, "A space ninja is about to spawn. Would you like to play as the ninja?", "Space Ninja", list("Yes","No"), "Yes", 300, 1, "350x125") == "Yes")
accepted_ghost = G
else
candidates -= G
if(accepted_ghost)
//someone accepted
space_ninja_arrival(accepted_ghost)
/proc/space_ninja_arrival(var/mob/dead/observer/G)
if(!G)
return choose_space_ninja()
var/datum/game_mode/current_mode = ticker.mode
var/datum/mind/current_mind
@@ -137,19 +163,9 @@ Malf AIs/silicons aren't added. Monkeys aren't added. Messes with objective comp
if(L.name == "carpspawn")
spawn_list.Add(L)
var/list/candidates = list() //list of candidate keys
for(var/mob/dead/observer/G in player_list)
if(G.client && !G.client.holder && ((G.client.inactivity/10)/60) <= 5)
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
candidates += G.key
if(!candidates.len) return
candidates = shuffle(candidates)//Incorporating Donkie's list shuffle
//The ninja will be created on the right spawn point or at late join.
var/mob/living/carbon/human/new_ninja = create_space_ninja(pick(spawn_list.len ? spawn_list : latejoin ))
new_ninja.key = pick(candidates)
new_ninja.key = G.ckey
new_ninja.wear_suit:randomize_param()//Give them a random set of suit parameters.
new_ninja.internal = new_ninja.s_store //So the poor ninja has something to breath when they spawn in spess.
new_ninja.internals.icon_state = "internal1"

View File

@@ -148,18 +148,6 @@ var/global/datum/controller/gameticker/ticker
spawn(3000)
statistic_cycle() // Polls population totals regularly and stores them in an SQL DB -- TLE
//setup vermin spawn areas
var/list/vermin_spawn_areas = list("/area/maintenance","/area/mine/maintenance","/area/crew_quarters/locker/locker_toilet","/area/crew_quarters/toilet")
vermin_spawn_turfs = new/list()
for(var/area_text in vermin_spawn_areas)
var/area_base_type = text2path(area_text)
for(var/area in typesof(area_base_type))
var/list/area_turfs = get_area_turfs(area)
for(var/turf/T in area_turfs)
if(T.density)
area_turfs -= T
vermin_spawn_turfs.Add(area_turfs)
return 1
/datum/controller/gameticker

View File

@@ -68,9 +68,6 @@
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
L.imp_in = H
L.implanted = 1
return 1
@@ -120,9 +117,6 @@
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/device/detective_scanner(H), slot_in_backpack)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
L.imp_in = H
L.implanted = 1
return 1
@@ -156,7 +150,4 @@
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
L.imp_in = H
L.implanted = 1
return 1

View File

@@ -154,7 +154,7 @@
update_desc()
break
user << desc
if(P.loc != src && !istype(P, /obj/item/weapon/cable_coil))
if(P && P.loc != src && !istype(P, /obj/item/weapon/cable_coil))
user << "\red You cannot add that component to the machine!"

View File

@@ -2,6 +2,7 @@
desc = "An aging combat exosuit utilized by the Nanotrasen corporation. Originally developed to combat hostile alien lifeforms."
name = "Durand"
icon_state = "durand"
initial_icon = "durand"
step_in = 4
dir_in = 1 //Facing North.
health = 400

View File

@@ -2,6 +2,7 @@
desc = "A lightweight, security exosuit. Popular among private and corporate security."
name = "Gygax"
icon_state = "gygax"
initial_icon = "gygax"
step_in = 3
dir_in = 1 //Facing North.
health = 300
@@ -19,6 +20,7 @@
desc = "A lightweight exosuit used by Nanotrasen Death Squads. A significantly upgraded Gygax security mech."
name = "Dark Gygax"
icon_state = "darkgygax"
initial_icon = "darkgygax"
health = 400
deflect_chance = 25
damage_absorption = list("brute"=0.6,"fire"=0.8,"bullet"=0.6,"laser"=0.5,"energy"=0.65,"bomb"=0.8)

View File

@@ -2,6 +2,7 @@
desc = "Produced by \"Tyranny of Honk, INC\", this exosuit is designed as heavy clown-support. Used to spread the fun and joy of life. HONK!"
name = "H.O.N.K"
icon_state = "honker"
initial_icon = "honker"
step_in = 2
health = 140
deflect_chance = 60

View File

@@ -2,6 +2,7 @@
desc = "Heavy-duty, combat exosuit, developed after the Durand model. Rarely found among civilian populations."
name = "Marauder"
icon_state = "marauder"
initial_icon = "marauder"
step_in = 5
health = 500
deflect_chance = 25
@@ -25,6 +26,7 @@
desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel."
name = "Seraph"
icon_state = "seraph"
initial_icon = "seraph"
operation_req_access = list(access_cent_creed)
step_in = 3
health = 550
@@ -37,6 +39,7 @@
desc = "Heavy-duty, combat exosuit, developed off of the existing Marauder model."
name = "Mauler"
icon_state = "mauler"
initial_icon = "mauler"
operation_req_access = list(access_syndicate)
wreckage = /obj/effect/decal/mecha_wreckage/mauler

View File

@@ -2,6 +2,7 @@
desc = "An exosuit which can only be described as 'WTF?'."
name = "Phazon"
icon_state = "phazon"
initial_icon = "phazon"
step_in = 1
dir_in = 1 //Facing North.
step_energy_drain = 3

View File

@@ -18,6 +18,7 @@
unacidable = 1 //and no deleting hoomans inside
layer = MOB_LAYER //icon draw layer
infra_luminosity = 15 //byond implementation is bugged.
var/initial_icon = "" //Mech type for resetting icon.
var/can_move = 1
var/mob/living/carbon/occupant = null
var/step_in = 10 //make a step in step_in/10 sec.
@@ -678,6 +679,7 @@
/obj/mecha/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/device/mmi))
if(mmi_move_inside(W,user))
user << "[src]-MMI interface initialized successfuly"
@@ -1025,7 +1027,7 @@
src.add_fingerprint(H)
src.forceMove(src.loc)
src.log_append_to_last("[H] moved in as pilot.")
src.icon_state = initial(icon_state)
src.icon_state = src.reset_icon()
dir = dir_in
playsound(src, 'sound/machines/windowdoor.ogg', 50, 1)
if(!hasInternalDamage())
@@ -1086,7 +1088,7 @@
src.verbs -= /obj/mecha/verb/eject
src.Entered(mmi_as_oc)
src.Move(src.loc)
src.icon_state = initial(icon_state)
src.icon_state = src.reset_icon()
dir = dir_in
src.log_message("[mmi_as_oc] moved in as pilot.")
if(!hasInternalDamage())
@@ -1175,7 +1177,7 @@
src.occupant.canmove = 0
src.verbs += /obj/mecha/verb/eject
src.occupant = null
src.icon_state = initial(icon_state)+"-open"
src.icon_state = src.reset_icon()+"-open"
src.dir = dir_in
return
@@ -1662,6 +1664,9 @@
return 1
return 0
/obj/mecha/proc/reset_icon()
icon_state = initial_icon
return icon_state
//////////////////////////////////////////
//////// Mecha global iterators ////////
@@ -1792,4 +1797,4 @@
//src.health = initial(src.health)/2.2
//src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
return
*/
*/

View File

@@ -2,6 +2,7 @@
desc = "These exosuits are developed and produced by Vey-Med. (&copy; All rights reserved)."
name = "Odysseus"
icon_state = "odysseus"
initial_icon = "odysseus"
step_in = 2
max_temperature = 1500
health = 120

View File

@@ -2,6 +2,7 @@
desc = "Autonomous Power Loader Unit. The workhorse of the exosuit world."
name = "APLU \"Ripley\""
icon_state = "ripley"
initial_icon = "ripley"
step_in = 6
max_temperature = 1000
health = 200
@@ -19,6 +20,7 @@
desc = "Standart APLU chassis was refitted with additional thermal protection and cistern."
name = "APLU \"Firefighter\""
icon_state = "firefighter"
initial_icon = "firefighter"
max_temperature = 2500
health = 250
lights_power = 8
@@ -29,6 +31,7 @@
desc = "OH SHIT IT'S THE DEATHSQUAD WE'RE ALL GONNA DIE"
name = "DEATH-RIPLEY"
icon_state = "deathripley"
initial_icon = "deathripley"
step_in = 2
opacity=0
lights_power = 60
@@ -44,6 +47,7 @@
/obj/mecha/working/ripley/mining
desc = "An old, dusty mining ripley."
name = "APLU \"Miner\""
initial_icon = "ripley"
/obj/mecha/working/ripley/mining/New()
..()
@@ -110,4 +114,16 @@
return
/obj/mecha/working/ripley/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/fluff/butcher_royce_1))
src.icon_state = "titan"
src.initial_icon = "titan"
src.name = "APLU \"Titan's Fist\""
src.desc = "This ordinary mining Ripley has been customized to look like a unit of the Titans Fist."
user << "You spend some quality time with the Ripley, customising it to look like a \"Titan's Fist\" APLU."
user.drop_item()
del(W)
return
else
..()

View File

@@ -8,7 +8,7 @@
..()
human
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/up,/obj/effect/decal/cleanable/blood/gibs/down,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/body,/obj/effect/decal/cleanable/blood/gibs/limb,/obj/effect/decal/cleanable/blood/gibs/core)
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/down,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/core)
gibamounts = list(1,1,1,1,1,1,1)
New()

View File

@@ -95,7 +95,8 @@
"/obj/item/stack/medical",
"/obj/item/device/flashlight/pen",
"/obj/item/clothing/mask/surgical",
"/obj/item/clothing/gloves/latex"
"/obj/item/clothing/gloves/latex",
"/obj/item/weapon/reagent_containers/hypospray/autoinjector"
)
@@ -153,4 +154,4 @@
storage_slots = 1
can_hold = list(
"/obj/item/clothing/mask/luchador"
)
)

View File

@@ -26,6 +26,7 @@
var/be_alien = 0 //Check if that guy wants to be an alien
var/be_pai = 1 //Consider client when searching for players to recruit as a pAI
var/be_syndicate = 1 //Consider client for late-game autotraitor
var/be_spaceninja = 0
var/activeslot = 1 //Default active slot!
var/STFU_ghosts //80+ people rounds are fun to admin when text flies faster than airport security
var/STFU_radio //80+ people rounds are fun to admin when text flies faster than airport security

View File

@@ -1,3 +1,4 @@
hi
// Add custom items you give to people here, and put their icons in custom_items.dmi
// Remember to change 'icon = 'custom_items.dmi'' for items not using /obj/item/fluff as a base
// Clothing item_state doesn't use custom_items.dmi. Just add them to the normal clothing files.
@@ -66,10 +67,20 @@
desc = "A neatly folded handkerchief embroidered with a 'M'."
icon_state = "maurice_bedford_1"
/obj/item/weapon/book/fluff/johnathan_falcian_1
name = "sketchbook"
desc = "A small, well-used sketchbook."
icon = 'custom_items.dmi'
icon_state = "johnathan_notebook"
dat = "In the notebook there are numerous drawings of various crew-mates, locations, and scenes on the ship. They are of fairly good quality."
author = "Johnathan Falcian"
title = "Falcian's sketchbook"
//////////////////////////////////
////////// Usable Items //////////
//////////////////////////////////
/obj/item/weapon/pen/fluff/multi //spaceman96: Trenna Seber
name = "multicolor pen"
desc = "It's a cool looking pen. Lots of colors!"
@@ -330,10 +341,17 @@
/obj/item/weapon/crowbar/fluff/zelda_creedy_1 //daaneesh: Zelda Creedy
name = "Zelda's Crowbar"
desc = "A pink crow bar that has an engraving that reads, 'To Zelda. Love always, Dawn'"
icon = 'icons/obj/custom_items.dmi'
icon = 'custom_items.dmi'
icon_state = "zeldacrowbar"
item_state = "crowbar"
////// Ripley customisation kit - Butchery Royce - MayeDay
/obj/item/weapon/fluff/butcher_royce_1
name = "Ripley customisation kit"
desc = "A kit containing all the needed tools and parts to turn an APLU Ripley into a Titan's Fist worker mech."
icon = 'custom_items.dmi'
icon_state = "royce_kit"
//////////////////////////////////
//////////// Clothing ////////////
@@ -384,6 +402,19 @@
icon = 'custom_items.dmi'
icon_state = "ian_colm_1"
////// Medical eyepatch - Thysse Ezinwa - Jadepython
/obj/item/clothing/glasses/eyepatch/fluff/thysse_1
name = "medical eyepatch"
desc = "On the strap, EZINWA is written in white block letters."
////// Safety Goggles - Arjun Chopra - MindPhyre - APPROVED
/obj/item/clothing/glasses/fluff/arjun_chopra_1
name = "safety goggles"
desc = "A used pair of leather safety goggles."
icon = 'custom_items.dmi'
icon_state = "arjun_chopra"
item_state = "arjun_chopra"
//////////// Hats ////////////
/obj/item/clothing/head/secsoft/fluff/swatcap //deusdactyl: James Girard
@@ -500,6 +531,50 @@
item_state = "ara_bar_uniform"
color = "ara_bar_uniform"
/////// NT-SID Suit //Zuhayr: Jane Doe
/obj/item/clothing/under/fluff/jane_sidsuit
name = "NT-SID jumpsuit"
desc = "A NanoTrasen Synthetic Intelligence Division jumpsuit, issued to 'volunteers'. On other people it looks fine, but right here a scientist has noted: on you it looks stupid."
icon = 'icons/obj/custom_items.dmi'
icon_state = "jane_sid_suit"
item_state = "jane_sid_suit"
color = "jane_sid_suit"
has_sensor = 2
sensor_mode = 3
flags = FPRINT | TABLEPASS
//Suit roll-down toggle.
/obj/item/clothing/under/fluff/jane_sidsuit/verb/toggle_zipper()
set name = "Toggle Jumpsuit Zipper"
set category = "Object"
set src in usr
if(!usr.canmove || usr.stat || usr.restrained())
return 0
if(src.icon_state == "jane_sid_suit_down")
src.color = "jane_sid_suit"
usr << "You zip up the [src]."
else
src.color = "jane_sid_suit_down"
usr << "You unzip and roll down the [src]."
src.icon_state = "[color]"
src.item_state = "[color]"
usr.update_inv_w_uniform()
////// Wyatt's Ex-Commander Jumpsuit - RawrTaicho
/obj/item/clothing/under/fluff/wyatt_1
name = "ex-commander jumpsuit"
desc = "A standard Central Command Engineering Commander jumpsuit tailored to fight the wearer tightly. It has a Medal of Service pinned onto the left side of it."
icon = 'custom_items.dmi'
icon_state = "wyatt_uniform"
item_state = "wyatt_uniform"
color = "wyatt_uniform"
//////////// Masks ////////////
/*
@@ -522,6 +597,41 @@
flags = FPRINT|TABLEPASS
w_class = 1
////// Small locket - Altair An-Nasaqan - Serithi
/obj/item/clothing/tie/fluff/altair_locket
name = "small locket"
desc = "A small golden locket attached to an Ii'rka-reed string. Inside the locket is a holo-picture of a female Tajaran, and an inscription writtin in Siik'mas."
icon = 'custom_items.dmi'
icon_state = "altair_locket"
item_state = "altair_locket"
color = "altair_locket"
slot_flags = 0
flags = FPRINT|TABLEPASS
w_class = 1
slot_flags = SLOT_MASK
////// Medallion - Nasir Khayyam - Jamini
/obj/item/clothing/tie/fluff/nasir_khayyam_1
name = "medallion"
desc = "This silvered medallion bears the symbol of the Hadii Clan of the Tajaran."
icon = 'custom_items.dmi'
icon_state = "nasir_khayyam_1"
flags = FPRINT|TABLEPASS
w_class = 1
slot_flags = SLOT_MASK
////// Emerald necklace - Ty Foster - Nega
/obj/item/clothing/mask/mara_kilpatrick_1
name = "emerald necklace"
desc = "A brass necklace with a green emerald placed at the end. It has a small inscription on the top of the chain, saying \'Foster\'"
icon = 'custom_items.dmi'
icon_state = "ty_foster"
flags = FPRINT|TABLEPASS
w_class = 1
//////////// Shoes ////////////
/obj/item/clothing/shoes/magboots/fluff/susan_harris_1 //sniperyeti: Susan Harris
@@ -529,22 +639,6 @@
desc = "A colorful pair of magboots with the name Susan Harris clearly written on the back."
icon = 'custom_items.dmi'
icon_state = "atmosmagboots0"
toggle()
set name = "Toggle Magboots"
set category = "Object"
set src in usr
if(src.magpulse)
src.flags &= ~NOSLIP
src.slowdown = SHOES_SLOWDOWN
src.magpulse = 0
icon_state = "atmosmagboots0"
usr << "You disable the mag-pulse traction system."
else
src.flags |= NOSLIP
src.slowdown = 2
src.magpulse = 1
icon_state = "atmosmagboots1"
usr << "You enable the mag-pulse traction system."
//////////// Sets ////////////
@@ -593,3 +687,13 @@
icon_state = "retpoluniform"
color = "retpoluniform"
//////////// Weapons ////////////
///// Colt Peacemaker - Ana Ka'Rimah - SueTheCake
/obj/item/weapon/gun/energy/stunrevolver/fluff/ana_peacemaker
name = "Peacemaker"
desc = "A nickel-plated revolver with pearl grips. It has a certain Old West flair!"
icon = 'custom_items.dmi'
icon_state = "peacemaker"

View File

@@ -257,6 +257,17 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
client.be_pai = 1
src << "You will now be considered a viable candidate when a pAI device requests a new personality, effective until the end of this round."
/mob/dead/observer/verb/toggle_spaceninja_candidate()
set name = "Toggle Be Space Ninja Candidate"
set category = "Ghost"
set desc = "Determines whether you will be a candidate for when a new space ninja spawns. (toggle)"
if(client.be_spaceninja)
client.be_spaceninja = 0
src << "You are now excluded from space ninja candidate lists until end of round."
else
client.be_spaceninja = 1
src << "You are now included in space ninja candidate lists until end of round."
/mob/dead/observer/memory()
set hidden = 1
src << "\red You are dead! You have no mind to store memory!"

View File

@@ -21,7 +21,7 @@
var/move_delay_add = 0 // movement delay to add
status_flags = CANPARALYSE
var/heal_rate = 5
var/heal_rate = 1
var/plasma_rate = 5
var/oxygen_alert = 0

View File

@@ -106,7 +106,7 @@ I kind of like the right click only--the window version can get a little confusi
/mob/living/carbon/alien/humanoid/proc/neurotoxin(mob/target as mob in oview())
set name = "Spit Neurotoxin (50)"
set desc = "Spits neurotoxin at someone, paralyzing them for a short time."
set desc = "Spits neurotoxin at someone, paralyzing them for a short time if they are not wearing protective gear."
set category = "Alien"
if(powerc(50))
@@ -129,12 +129,12 @@ I kind of like the right click only--the window version can get a little confusi
if(!istype(T, /turf))
return
if (U == T)
usr.bullet_act(src, get_organ_target())
usr.bullet_act(new /obj/item/projectile/neurotoxin(usr.loc), get_organ_target())
return
if(!istype(U, /turf))
return
var/obj/item/projectile/energy/dart/A = new /obj/item/projectile/energy/dart(usr.loc)
var/obj/item/projectile/neurotoxin/A = new /obj/item/projectile/neurotoxin(usr.loc)
A.current = U
A.yo = U.y - T.y

View File

@@ -89,7 +89,8 @@ var/const/MAX_ACTIVE_TIME = 400
return
/obj/item/clothing/mask/facehugger/throw_impact(atom/hit_atom)
Attach(hit_atom)
if(prob(25))
Attach(hit_atom)
return
/obj/item/clothing/mask/facehugger/proc/Attach(M as mob)
@@ -129,17 +130,21 @@ var/const/MAX_ACTIVE_TIME = 400
for(var/mob/O in viewers(target, null))
O.show_message("\red \b [src] tears [W] off of [target]'s face!", 1)
loc = target
layer = 20
target.wear_mask = src
target.update_inv_wear_mask()
if(prob(75))
loc = target
layer = 20
target.wear_mask = src
target.update_inv_wear_mask()
GoIdle() //so it doesn't jump the people that tear it off
GoIdle() //so it doesn't jump the people that tear it off
if(!sterile) target.Paralyse(MAX_IMPREGNATION_TIME/6) //something like 25 ticks = 20 seconds with the default settings
if(!sterile) target.Paralyse(MAX_IMPREGNATION_TIME/6) //something like 25 ticks = 20 seconds with the default settings
spawn(rand(MIN_IMPREGNATION_TIME,MAX_IMPREGNATION_TIME))
Impregnate(target)
spawn(rand(MIN_IMPREGNATION_TIME,MAX_IMPREGNATION_TIME))
Impregnate(target)
else
for(var/mob/O in viewers(target, null))
O.show_message("\red \b [src] misses [target]'s face!", 1)
return

View File

@@ -192,7 +192,7 @@
swap_hand()
/mob/living/carbon/proc/help_shake_act(mob/living/carbon/M)
if (src.health > 0)
if (src.health > config.health_threshold_crit)
if(src == M && istype(src, /mob/living/carbon/human))
var/mob/living/carbon/human/H = src
src.visible_message( \

View File

@@ -11,6 +11,14 @@
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
for(var/datum/organ/external/E in src.organs)
if(istype(E, /datum/organ/external/chest))
continue
// Only make the limb drop if it's not too damaged
if(prob(100 - E.get_damage()))
// Override the current limb status and don't cause an explosion
E.droplimb(1,1)
flick("gibbed-h", animation)
hgibs(loc, viruses, dna)
@@ -100,4 +108,4 @@
/mob/living/carbon/human/proc/Drain()
ChangeToHusk()
mutations |= NOCLONE
return
return

View File

@@ -42,19 +42,20 @@
apply_damage(damage, BRUTE, affecting, armor_block)
if (damage >= 25)
visible_message("\red <B>[M] has wounded [src]!</B>")
apply_effect(4, WEAKEN, armor_block)
apply_effect(rand(0.5,3), WEAKEN, armor_block)
updatehealth()
if("disarm")
var/randn = rand(1, 100)
if (randn <= 90)
if (prob(80))
playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1)
Weaken(rand(10,15))
Weaken(rand(0.5,3))
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message(text("\red <B>[] has tackled down []!</B>", M, src), 1)
if (prob(25))
M.Weaken(rand(2,4))
else
if (randn <= 99)
if (prob(80))
playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1)
drop_item()
for(var/mob/O in viewers(src, null))

View File

@@ -304,7 +304,7 @@
/obj/effect/equip_e/human/process()
if (item)
item.add_fingerprint(source)
if (!item)
else
switch(place)
if("mask")
if (!( target.wear_mask ))
@@ -541,7 +541,7 @@ It can still be worn/put on as normal.
if (target.legcuffed)
strip_item = target.legcuffed
if("CPR")
if ((target.health >= -99.0 && target.health <= 0))
if ((target.health > config.health_threshold_dead && target.health < config.health_threshold_crit))
var/suff = min(target.getOxyLoss(), 7)
target.adjustOxyLoss(-suff)
target.updatehealth()

View File

@@ -12,6 +12,7 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
"pAI candidate" = 1, // -- TLE // 7
"cultist" = IS_MODE_COMPILED("cult"), // 8
"infested monkey" = IS_MODE_COMPILED("monkey"), // 9
"space ninja" = "true", // 9
)
var/global/list/underwear_m = list("White", "Grey", "Green", "Blue", "Black", "Mankini", "Love-Hearts", "Black2", "Grey2", "Stripey", "Kinky", "None") //Curse whoever made male/female underwear diffrent colours
@@ -28,6 +29,7 @@ var/const/BE_ALIEN =(1<<6)
var/const/BE_PAI =(1<<7)
var/const/BE_CULTIST =(1<<8)
var/const/BE_MONKEY =(1<<9)
var/const/BE_SPACENINJA=(1<<10)
var/const/MAX_SAVE_SLOTS = 10
@@ -236,8 +238,8 @@ datum/preferences
dat += "<a href=\"byond://?src=\ref[user];preference=slotname;task=input\">Rename slot</a> - "
dat += "<a href=\"byond://?src=\ref[user];preference=reload\">Reload slot</a>"
//column 1
dat += "</center><hr><table><tr><td width='310px'>"
//COLUMN 1
dat += "</center><hr><table><tr><td width='285px'>"
dat += "<b>Name:</b> "
dat += "<a href=\"byond://?src=\ref[user];preference=name;task=input\"><b>[real_name]</b></a> "
@@ -263,41 +265,68 @@ datum/preferences
dat += "[(sound_adminhelp)?"On":"Off"] <a href='byond://?src=\ref[user];preference=hear_adminhelps'>toggle</a><br>"
if(user.client.holder.level >= 5)
dat += "<br><b>OOC</b><br>"
dat += "<a href='byond://?src=\ref[user];preference=ooccolor;task=input'>Change color</a> <font face=\"fixedsys\" size=\"3\" color=\"[ooccolor]\"><table style='display:inline;' bgcolor=\"[ooccolor]\"><tr><td>__</td></tr></table></font><br>"
dat += "<br><a href='byond://?src=\ref[user];preference=ooccolor;task=input'><b>OOC color</b></a> <font face=\"fixedsys\" size=\"3\" color=\"[ooccolor]\"><table style='display:inline;' bgcolor=\"[ooccolor]\"><tr><td>__</td></tr></table></font><br>"
dat += "<br><b>Occupation Choices</b><br>"
dat += "\t<a href=\"byond://?src=\ref[user];preference=job;task=menu\"><b>Set Preferences</b></a><br><br>"
dat += "\t<a href=\"byond://?src=\ref[user];preference=job;task=menu\"><b>Occupation Preferences</b></a><br>"
if(jobban_isbanned(user, "Records"))
dat += "<b>You are banned from using character records.</b><br>"
else
dat += "<b><a href=\"byond://?src=\ref[user];preference=records;record=1\">Character Records</a></b><br><br>"
dat += "<b><a href=\"byond://?src=\ref[user];preference=records;record=1\">Character Records</a></b><br>"
dat += "<b>Flavor Text</b><br>"
dat += "<a href='byond://?src=\ref[user];preference=flavor_text;task=input'>Change</a><br>"
dat += "\t<a href=\"byond://?src=\ref[user];preference=skills\"><b>Set Skills</b> (<i>[GetSkillClass(used_skillpoints)][used_skillpoints > 0 ? " [used_skillpoints]" : "0"])</i></a><br>"
dat += "<a href='byond://?src=\ref[user];preference=flavor_text;task=input'><b>Set Flavor Text</b></a><br>"
if(lentext(flavor_text) <= 40)
dat += "[flavor_text]"
if(!lentext(flavor_text))
dat += "\[...\]"
else
dat += "[flavor_text]"
else
dat += "[copytext(flavor_text, 1, 37)]...<br>"
dat += "<br>"
dat += "<b>Skill Choices</b><br>"
dat += "\t<i>[GetSkillClass(used_skillpoints)]</i> ([used_skillpoints])<br>"
dat += "\t<a href=\"byond://?src=\ref[user];preference=skills\"><b>Set Skills</b></a><br><br>"
//column 2
dat += "</td><td width='310px'>" //height='300px'
dat += "<table><tr><td width=100><b>Body</b> "
dat += "(<a href=\"byond://?src=\ref[user];preference=all;task=random\">&reg;</A>)"
//antag
dat += "<br>"
if(jobban_isbanned(user, "Syndicate"))
dat += "<b>You are banned from antagonist roles.</b>"
src.be_special = 0
else
var/n = 0
for (var/i in special_roles)
if(special_roles[i]) //if mode is available on the server
if(jobban_isbanned(user, i))
dat += "<b>Be [i]:</b> <font color=red><b> \[BANNED]</b></font><br>"
else if(i == "pai candidate")
if(jobban_isbanned(user, "pAI"))
dat += "<b>Be [i]:</b> <font color=red><b> \[BANNED]</b></font><br>"
else
dat += "<b>Be [i]:</b> <a href=\"byond://?src=\ref[user];preference=be_special;num=[n]\"><b>[src.be_special&(1<<n) ? "Yes" : "No"]</b></a><br>"
n++
dat += "</td>"
//COLUMN 2
dat += "<td>"
dat += "<table><tr>"
dat += "<td width='142px'>"
dat += "<b>Body</b> (<a href=\"byond://?src=\ref[user];preference=all;task=random\">&reg;</A>)<br>"
dat += "Species: <a href='byond://?src=\ref[user];preference=species;task=input'>[species]</a><br>"
dat += "Blood Type: <a href='byond://?src=\ref[user];preference=b_type;task=input'>[b_type]</a><br>"
dat += "Skin Tone: <a href='byond://?src=\ref[user];preference=s_tone;task=input'>[-s_tone + 35]/220<br></a>"
dat += "Skin Tone: <a href='byond://?src=\ref[user];preference=s_tone;task=input'>[-s_tone + 35]/220</a><br>"
dat += "<a href='byond://?src=\ref[user];preference=skin_style;task=input'>Adjust Skin</a><br>"
dat += "<a href='byond://?src=\ref[user];preference=limbs;task=input'>Adjust Limbs</a><br>"
dat += "</td>"
dat += "Limbs: <a href='byond://?src=\ref[user];preference=limbs;task=input'>Adjust Limbs</a><br>"
dat += "<td><b>Preview</b></br>"
dat += "<img src=previewicon.png height=64 width=64><img src=previewicon2.png height=64 width=64></br></td>"
dat += "</tr></table>"
//display limbs below
var/ind = 0
for(var/name in organ_data)
//world << "[ind] \ [organ_data.len]"
var/status = organ_data[name]
var/organ_name = null
switch(name)
@@ -319,11 +348,18 @@ datum/preferences
organ_name = "right hand"
if(status == "cyborg")
dat += "\tRobotical [organ_name] prothesis<br>"
if(status == "amputated")
dat += "\tAmputated [organ_name]<br>"
dat+="<br>"
++ind
if(ind > 1)
dat += ", "
dat += "\tMechanical [organ_name] prothesis"
else if(status == "amputated")
++ind
if(ind > 1)
dat += ", "
dat += "\tAmputated [organ_name]"
if(ind)
dat += "\[...\]"
dat += "<br><br>"
if(gender == MALE)
dat += "Underwear: <a href =\"byond://?src=\ref[user];preference=underwear;task=input\"><b>[underwear_m[underwear]]</b></a><br>"
@@ -332,8 +368,6 @@ datum/preferences
dat += "Backpack Type:<br><a href =\"byond://?src=\ref[user];preference=bag;task=input\"><b>[backbaglist[backbag]]</b></a><br>"
dat += "</td><td><b>Preview</b><br><img src=previewicon.png height=64 width=64><img src=previewicon2.png height=64 width=64></td></tr></table>"
dat += "<br><b>Hair</b><br>"
dat += "<a href='byond://?src=\ref[user];preference=hair;task=input'>Change Color</a> <font face=\"fixedsys\" size=\"3\" color=\"#[num2hex(r_hair, 2)][num2hex(g_hair, 2)][num2hex(b_hair, 2)]\"><table style='display:inline;' bgcolor=\"#[num2hex(r_hair, 2)][num2hex(g_hair, 2)][num2hex(b_hair)]\"><tr><td>__</td></tr></table></font><br>"
dat += "Style: <a href='byond://?src=\ref[user];preference=h_style;task=input'>[h_style]</a><br>"
@@ -345,22 +379,7 @@ datum/preferences
dat += "<br><b>Eyes</b><br>"
dat += "<a href='byond://?src=\ref[user];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>"
dat += "<br><br>"
if(jobban_isbanned(user, "Syndicate"))
dat += "<b>You are banned from antagonist roles.</b>"
src.be_special = 0
else
var/n = 0
for (var/i in special_roles)
if(special_roles[i]) //if mode is available on the server
if(jobban_isbanned(user, i))
dat += "<b>Be [i]:</b> <font color=red><b> \[BANNED]</b></font><br>"
else if(i == "pai candidate")
if(jobban_isbanned(user, "pAI"))
dat += "<b>Be [i]:</b> <font color=red><b> \[BANNED]</b></font><br>"
else
dat += "<b>Be [i]:</b> <a href=\"byond://?src=\ref[user];preference=be_special;num=[n]\"><b>[src.be_special&(1<<n) ? "Yes" : "No"]</b></a><br>"
n++
dat += "<br>"
dat += "</td></tr></table><center>"
dat += "<hr>"
@@ -1021,6 +1040,10 @@ datum/preferences
if(second_limb)
organ_data[second_limb] = "cyborg"
if("skin_style")
var/skin_style_name = input(user, "Select a new skin style") as null|anything in list("default1", "default2", "default3")
if(!skin_style_name) return
else
switch(href_list["preference"])
@@ -1231,6 +1254,7 @@ datum/preferences
C.be_alien = be_special & BE_ALIEN
C.be_pai = be_special & BE_PAI
C.be_syndicate = be_special & BE_TRAITOR
C.be_spaceninja = be_special & BE_SPACENINJA
if(isnull(src.ghost_ears)) src.ghost_ears = 1 //There were problems where the default was null before someone saved their profile.
C.ghost_ears = src.ghost_ears
C.ghost_sight = src.ghost_sight

View File

@@ -331,3 +331,29 @@
name = "Tajaran Ears"
icon_state = "tajears"
species_allowed = list("Tajaran")
//skin styles - WIP
/datum/sprite_accessory/skin
human
name = "Default human skin"
icon = "human"
human_tatt01
name = "Tatt01 human skin"
icon = "human_tattoo1"
tajaran
name = "Default tajaran skin"
icon = "tajaran"
species_allowed = list("Tajaran")
soghun
name = "Default soghun skin"
icon = "soghun"
species_allowed = list("Soghun")
skrell
name = "Default skrell skin"
icon = "skrell"
species_allowed = list("Skrell")

View File

@@ -518,6 +518,7 @@
if ((!( L.stat ) && L.canmove && !( L.restrained() )))
var/resisting = 0
for(var/obj/O in L.requests)
L.requests.Remove(O)
del(O)
resisting++
for(var/obj/item/weapon/grab/G in usr.grabbed_by)

View File

@@ -29,7 +29,7 @@
dna = null
O.dna.uni_identity = "00600200A00E0110148FC01300B009"
//O.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8"
O.dna.struc_enzymes = "[copytext(O.dna.struc_enzymes,1,1+3*13)]BB8"
O.dna.struc_enzymes = "[copytext(O.dna.struc_enzymes,1,1+3*(STRUCDNASIZE-1))]BB8"
O.loc = loc
O.viruses = viruses
viruses = list()

View File

@@ -213,12 +213,22 @@ display round(lastgen) and plasmatank amount
user << "\blue You open the access panel."
else
user << "\blue You close the access panel."
else if(istype(O, /obj/item/weapon/crowbar) && !open)
else if(istype(O, /obj/item/weapon/crowbar) && open)
var/obj/machinery/constructable_frame/machine_frame/new_frame = new /obj/machinery/constructable_frame/machine_frame(src.loc)
for(var/obj/item/I in component_parts)
if(I.reliability < 100)
I.crit_fail = 1
I.loc = src.loc
while ( sheets > 0 )
var/obj/item/stack/sheet/G = new sheet_path(src.loc)
if ( sheets > 50 )
G.amount = 50
else
G.amount = sheets
sheets -= G.amount
new_frame.state = 2
new_frame.icon_state = "box_1"
del(src)

View File

@@ -36,7 +36,7 @@
var/damage = 10
var/damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE are the only things that should be in here
var/nodamage = 0 //Determines if the projectile will skip any damage inflictions
var/flag = "bullet" //Defines what armor to use when it hits things. Must be set to bullet, laser, energy,or bomb
var/flag = "bullet" //Defines what armor to use when it hits things. Must be set to bullet, laser, energy,or bomb //Cael - bio and rad are also valid
var/projectile_type = "/obj/item/projectile"
var/kill_count = 50 //This will de-increment every process(). When 0, it will delete the projectile.
//Effects

View File

@@ -124,4 +124,12 @@
else if (istype(target, /mob/living/carbon/))
M.show_message("\blue The radiation beam dissipates harmlessly through your body.")
else
return 1
return 1
/obj/item/projectile/neurotoxin
name = "neurotoxin"
icon_state = "toxin"
damage = 5
damage_type = TOX
weaken = 5
flag = "bio"

View File

@@ -6,8 +6,9 @@
name = "hypospray"
desc = "The DeForest Medical Corporation hypospray is a sterile, air-needle autoinjector for rapid administration of drugs to patients."
icon = 'icons/obj/syringe.dmi'
item_state = "hypo"
item_state = "hypo1"
icon_state = "hypo"
var/original_icon_state = "hypo"
amount_per_transfer_from_this = 5
volume = 30
possible_transfer_amounts = null
@@ -56,6 +57,7 @@
name = "autoinjector"
desc = "A rapid and safe way to administer small amounts of drugs by untrained or trained personnel."
icon_state = "autoinjector"
original_icon_state = "autoinjector"
item_state = "autoinjector"
amount_per_transfer_from_this = 5
volume = 5
@@ -74,9 +76,9 @@
/obj/item/weapon/reagent_containers/hypospray/autoinjector/update_icon()
if(reagents.total_volume > 0)
icon_state = "[initial(icon_state)]1"
icon_state = "[original_icon_state]1"
else
icon_state = "[initial(icon_state)]0"
icon_state = "[original_icon_state]0"
/obj/item/weapon/reagent_containers/hypospray/autoinjector/examine()
..()

View File

@@ -21,7 +21,10 @@ furohman: Fay Sullivan: /obj/item/weapon/lighter/zippo/fluff/fay_sullivan_1
furlucis: Chal Appara: /obj/item/clothing/gloves/fluff/chal_appara_1
gvazdas: Sarah Carbrokes: /obj/item/fluff/sarah_carbrokes_1
jamini: Edwin Atweeke: /obj/item/clothing/suit/labcoat/fluff/burnt
jamini: Nasir Khayyam: /obj/item/clothing/tie/fluff/nasir_khayyam_1
jadepython: Thysse Ezinwa: /obj/item/clothing/glasses/eyepatch/fluff/thysse_1
kirbyelder: John McKeever: /obj/item/paper/fluff/john_mckeever_1
leon_the_killer: johnathan Falcian: /obj/item/weapon/clipboard/notebook/fluff/johnathan_falcian_1
leonheart11: Johann Erzatz: /obj/item/weapon/reagent_containers/food/drinks/flask/fluff/johann_erzatz_1
lexusjjss: Lexus Langg: /obj/item/weapon/clipboard/fluff/smallnote, /obj/item/weapon/reagent_containers/food/drinks/flask/fluff/shinyflask
lexusjjss: Zachary Tomlinson: /obj/item/weapon/clipboard/fluff/smallnote, /obj/item/weapon/reagent_containers/food/drinks/flask/fluff/shinyflask
@@ -29,10 +32,12 @@ madmalicemccrea: Alice McCrea: /obj/item/clothing/head/welding/fluff/alice_mccre
mangled: Li Matsuda: /obj/item/weapon/lighter/zippo/fluff/li_matsuda_1
maximumbob: Maurice Bedford: /obj/item/fluff/maurice_bedford_1
mcgulliver: Wox Derax: /obj/item/weapon/reagent_containers/food/drinks/flask/fluff/lithiumflask
mindphyre: Arjun Chopra: /obj/item/clothing/glasses/fluff/arjun_chopra_1
misterbook: Smoke Perkins: /obj/item/clothing/mask/cigarette/pipe
misterfox: Rashid Siraj: /obj/item/weapon/storage/bible/tajaran
morrinn: Maye Day: /obj/item/weapon/storage/fluff/maye_daye_1
naples: Russell Vierson: /obj/item/weapon/lighter/zippo/fluff/naples_1
nega10: Ty Foster: /obj/item/clothing/mask/mara_kilpatrick_1
nerezza: Asher Spock: /obj/item/weapon/reagent_containers/hypospray/fluff/asher_spock_1
nerezza: Asher Spock: /obj/item/weapon/card/id/fluff/asher_spock_2
orangebottle: Lillian Levett: /obj/item/weapon/pen/fluff/fancypen
@@ -40,11 +45,13 @@ orangebottle: Lilliana Reade: /obj/item/weapon/pen/fluff/fancypen
paththegreat: Eli Stevens: /obj/item/weapon/pen/fluff/fountainpen
phaux: Tian Krieger: /obj/item/clothing/under/fluff/tian_dress
rawrtaicho: Riley Rohtin: /obj/item/weapon/lighter/zippo/fluff/riley_rohtin_1
rawrtaicho: Wyatt Engstrom: /obj/item/clothing/under/fluff/wyatt_1
roaper: Ian Colm: /obj/item/weapon/card/id/fluff/ian_colm_1
roaper: Ian Colm: /obj/item/clothing/glasses/welding/fluff/ian_colm_2
rukral: Nashida Bisha'ra: /obj/item/weapon/reagent_containers/glass/beaker/large/fluff/nashida_bishara_1
searif: Yuki Matsuda: /obj/item/clothing/under/fluff/jumpsuitdown, /obj/item/clothing/head/welding/fluff/yuki_matsuda_1
searif: Ara Al-Jazari: /obj/item/clothing/under/rank/bartender/fluff/classy
serithi: Altair An-Nasaqan: /obj/item/clothing/tie/fluff/altair_locket
sirribbit: /obj/item/weapon/clipboard/fluff/mcreary_journal
sicktrigger: David Fanning: /obj/item/fluff/david_fanning_1
silentthunder: Val McNeil: /obj/item/fluff/val_mcneil_1
@@ -52,6 +59,7 @@ sniperyeti: Susan Harris: /obj/item/clothing/shoes/magboots/fluff/susan_harris_1
spaceman96: Trenna Seber: /obj/item/weapon/pen/fluff/multi, /obj/item/clothing/suit/labcoat/fluff/pink
sparklysheep: Cado Keppel: /obj/item/weapon/fluff/cado_keppel_1
sparklysheep: Uzenwa Sissra: /obj/item/clothing/glasses/fluff/uzenwa_sissra_1
suethecake: Ana Ka'Rimah: /obj/item/weapon/gun/energy/stunrevolver/fluff/ana_peacemaker
staghorn: Mara Kilpatrick: /obj/item/clothing/mask/mara_kilpatrick_1
tastyfish: Cindy Robertson: /obj/item/weapon/wrapping_paper
thatoneguy: Hugo Cinderbatch: /obj/item/weapon/fluff/hugo_cinderbacth_1
@@ -62,3 +70,4 @@ tzefa: Wes Solari: /obj/item/fluff/wes_solari_1
vinceluk: Seth Sealis: /obj/item/clothing/suit/det_suit/fluff/graycoat
whitellama: Ethan Way: /obj/item/fluff/ethan_way_1
whitewolf41: Jeremy Wolf: /obj/item/clothing/under/rank/security/fluff/jeremy_wolf_1
zuhayr: Jane Doe: /obj/item/clothing/under/fluff/jane_sidsuit

View File

@@ -56,6 +56,14 @@ Stuff which is in development and not yet visible to players or just code relate
should be listed in the changelog upon commit though. Thanks. -->
<!-- To take advantage of the pretty new format (well it was new when I wrote this anyway), open the "add-to-changelog.html" file in any browser and add the stuff and then generate the html code and paste it here -->
<div class="commit sansserif">
<h2 class="date">December 3rd</h2>
<h3 class="author">Cael_Aislinn updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Aliens have been significantly nerfed: neurotoxin is affected by bio protection suits, tackle stuns for much shorter time and facehuggers have a chance to fail when leaping.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">23.11.12</h2>
<h3 class="author">CIB updated:</h3>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 198 KiB

After

Width:  |  Height:  |  Size: 203 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 39 KiB