some modules things

This commit is contained in:
Poojawa
2017-02-08 00:06:03 -06:00
parent 01ed369034
commit f49c0c0268
25 changed files with 324 additions and 134 deletions
+7 -1
View File
@@ -105,7 +105,7 @@ Code:
user << "You transfer the frequency and code of \the [signaler2.name] to \the [name]"
else
..()
/obj/item/device/assembly/signaler/proc/signal()
if(!radio_connection) return
@@ -194,3 +194,9 @@ Code:
/obj/item/device/assembly/signaler/anomaly/attack_self()
return
/obj/item/device/assembly/signaler/cyborg
origin_tech = null
/obj/item/device/assembly/signaler/cyborg/attackby(obj/item/weapon/W, mob/user, params)
return
+96 -64
View File
@@ -1,22 +1,40 @@
#define SOAPSTONE_PREFIX_FILE "strings/soapstone_prefixes.txt"
#define SOAPSTONE_SUFFIX_FILE "soapstone_suffixes.json"
//Vocabulary lists; soapstones use a prefix and a suffix. Optionally, they can have a prefix and suffix, then a conjunction that links another set.
var/global/list/soapstone_prefixes = list() //Read from "strings/soapstone_prefixes.txt"; if you're adding your own, put **** where the subject should be!
var/global/list/soapstone_suffixes = list() //Read from "strings/soapstone_suffixes.json"
/obj/item/soapstone
name = "chisel"
desc = "Leave informative messages for the crew, including the crew of future shifts!\nEven if out of uses, it can still be used to remove messages.\n(Not suitable for engraving on shuttles, off station or on cats. Side effects may include beatings, bannings and orbital bombardment.)"
desc = "Leave \"informative\" messages for the crew, including the crew of future shifts!\n\
(Not suitable for engraving on shuttles, off station or on cats. Side effects may include beatings, bannings and orbital bombardment.)"
icon = 'icons/obj/items.dmi'
icon_state = "soapstone"
throw_speed = 3
throw_range = 5
w_class = WEIGHT_CLASS_TINY
var/tool_speed = 50
var/remaining_uses = 3
var/non_dull_name
var/w_engrave = "engrave"
var/w_engraving = "engraving"
var/w_chipping = "chipping"
var/w_dull = "dull"
/obj/item/soapstone/New()
. = ..()
if(!soapstone_prefixes.len)
soapstone_prefixes = file2list(SOAPSTONE_PREFIX_FILE, "\n")
if(!soapstone_suffixes.len)
soapstone_suffixes = list(\
"Characters" = strings(SOAPSTONE_SUFFIX_FILE, "Characters"), \
"Careers" = strings(SOAPSTONE_SUFFIX_FILE, "Careers"), \
"Antagonists" = strings(SOAPSTONE_SUFFIX_FILE, "Antagonists"), \
"Objects" = strings(SOAPSTONE_SUFFIX_FILE, "Objects"), \
"Techniques" = strings(SOAPSTONE_SUFFIX_FILE, "Techniques"), \
"Actions" = strings(SOAPSTONE_SUFFIX_FILE, "Actions"), \
"Geography" = strings(SOAPSTONE_SUFFIX_FILE, "Geography"), \
"Orientation" = strings(SOAPSTONE_SUFFIX_FILE, "Orientation"), \
"Body parts" = strings(SOAPSTONE_SUFFIX_FILE, "Body parts"), \
"Concepts" = strings(SOAPSTONE_SUFFIX_FILE, "Concepts"), \
"Musings" = strings(SOAPSTONE_SUFFIX_FILE, "Musings"), \
)
random_name()
check_name() // could start empty
@@ -25,9 +43,6 @@
non_dull_name = name
if(name == "chalk" || name == "magic marker")
desc = replacetext(desc, "engraving", "scribbling")
w_engrave = "scribble"
w_engraving = "scribbling"
w_chipping = "sketching"
if(name == "chalk")
w_dull = "used"
if(name == "magic marker")
@@ -35,9 +50,6 @@
if(name == "soapstone" || name == "chisel")
desc = replacetext(desc, "scribbling", "engraving")
w_engrave = initial(w_engrave)
w_engraving = initial(w_engraving)
w_chipping = initial(w_chipping)
w_dull = "dull"
/obj/item/soapstone/examine(mob/user)
@@ -48,59 +60,48 @@
user << "It looks like it can be used an unlimited number of times."
/obj/item/soapstone/afterattack(atom/target, mob/user, proximity)
if(!remaining_uses)
user << "<span class='warning'>[src] is [w_dull] and can't be used anymore!</span>"
return
var/turf/T = get_turf(target)
if(!proximity)
return
var/obj/structure/chisel_message/already_message = locate(/obj/structure/chisel_message) in T
var/our_message = FALSE
if(already_message)
our_message = already_message.creator_key == user.ckey
if(!remaining_uses && !already_message)
// The dull chisel is dull.
user << "<span class='warning'>[src] is [w_dull].</span>"
return
if(!good_chisel_message_location(T))
user << "<span class='warning'>It's not appropriate to [w_engrave] on [T].</span>"
return
if(already_message)
user.visible_message("<span class='notice'>[user] starts erasing [already_message].</span>", "<span class='notice'>You start erasing [already_message].</span>", "<span class='italics'>You hear a [w_chipping] sound.</span>")
playsound(loc, 'sound/items/gavel.ogg', 50, 1, -1)
// Removing our own messages refunds a charge
if(do_after(user, tool_speed, target=target))
user.visible_message("<span class='notice'>[user] has erased [already_message].</span>", "<span class='notice'>You erased [already_message].</span>")
already_message.persists = FALSE
qdel(already_message)
playsound(loc, 'sound/items/gavel.ogg', 50, 1, -1)
if(our_message)
var/obj/structure/chisel_message/msg = locate() in T
if(msg)
if(msg.creator_key != user.ckey)
user << "<span class='warning'>There's already a message there!</span>"
return
else
if(alert(user, "Erase this message?", name, "Yes", "No") == "Yes")
user.visible_message("<span class='notice'>[user] erases [msg].</span>", "<span class='notice'>You permanently erase [msg].</span>")
playsound(T, 'sound/items/gavel.ogg', 50, 1)
refund_use()
msg.persists = 0
qdel(msg)
return
return
if(!good_chisel_message_location(T))
user << "<span class='warning'>You can't write there!</span>"
return
var/message = stripped_input(user, "What would you like to [w_engrave]?", "[name] Message")
if(!message)
user << "You decide not to [w_engrave] anything."
var/prefix = input(user, "Choose a prefix for your message.", name) as null|anything in soapstone_prefixes
if(!prefix)
return
if(!target.Adjacent(user) && locate(/obj/structure/chisel_message) in T)
user << "You decide not to [w_engrave] anything."
var/suffix_category_string = input(user, "Choose a suffix category.", "[prefix]...") as null|anything in soapstone_suffixes
var/list/suffix_category = soapstone_suffixes[suffix_category_string]
if(!suffix_category || !suffix_category.len)
return
playsound(loc, 'sound/items/gavel.ogg', 50, 1, -1)
user.visible_message("<span class='notice'>[user] starts [w_engraving] a message into [T].</span>", "You start [w_engraving] a message into [T].", "<span class='italics'>You hear a [w_chipping] sound.</span>")
if(can_use() && do_after(user, tool_speed, target=T) && can_use())
if(!locate(/obj/structure/chisel_message in T))
user << "You [w_engrave] a message into [T]."
playsound(loc, 'sound/items/gavel.ogg', 50, 1, -1)
var/obj/structure/chisel_message/M = new(T)
M.register(user, message)
remove_use()
var/suffix = input(user, "Choose a suffix.", "[prefix]...") as null|anything in suffix_category
if(!suffix)
return
var/processed_message = replacetext(prefix, "****", suffix)
if(!user.Adjacent(T) || !good_chisel_message_location(T) || locate(/obj/structure/chisel_message) in T)
return
user.visible_message("<span class='notice'>[user] writes a message onto [T]!</span>", "<span class='notice'>You write a message onto [T].</span>")
playsound(T, 'sound/items/gavel.ogg', 50, 1)
var/obj/structure/chisel_message/M = new(T)
M.register(user, processed_message)
remove_use()
return 1
/obj/item/soapstone/proc/can_use()
if(remaining_uses == -1 || remaining_uses >= 0)
@@ -171,6 +172,34 @@
var/map
var/persists = TRUE
var/positive_ratings = 0
var/negative_ratings = 0
var/list/raters = list() //Ckeys who have rated this message
/obj/structure/chisel_message/attack_hand(mob/user)
if(user.ckey == creator_key)
user << "<span class='warning'>You can't rate your own messages!</span>"
return
if(raters[user.ckey])
user << "<span class='warning'>You've already rated this message!</span>"
return
switch(alert(user, "How would you like to rate this message?", "Message Rating", "Positive", "Negative", "Cancel"))
if("Positive")
for(var/client/C in clients)
if(C.ckey == creator_key)
C.mob << "<span class='notice'>One of your messages was rated as positive!</span>"
user << "<span class='noticealien'>You rated this message as positive.</span>"
positive_ratings++
raters[user.ckey] = "positive"
if("Negative")
for(var/client/C in clients)
if(C.ckey == creator_key)
C.mob << "<span class='danger'>One of your messages was rated as negative!</span>"
user << "<span class='danger'>You rated this message as negative.</span>"
negative_ratings++
raters[user.ckey] = "negative"
/obj/structure/chisel_message/New(newloc)
..()
SSpersistence.chisel_messages += src
@@ -190,12 +219,6 @@
map = MAP_NAME
update_icon()
/obj/structure/chisel_message/update_icon()
..()
var/hash = md5(hidden_message)
var/newcolor = copytext(hash, 1, 7)
add_atom_colour("#[newcolor]", FIXED_COLOUR_PRIORITY)
/obj/structure/chisel_message/proc/pack()
var/list/data = list()
data["hidden_message"] = hidden_message
@@ -206,6 +229,9 @@
var/turf/T = get_turf(src)
data["x"] = T.x
data["y"] = T.y
data["pos_ratings"] = positive_ratings
data["neg_ratings"] = positive_ratings
data["raters"] = raters
return data
/obj/structure/chisel_message/proc/unpack(list/data)
@@ -213,6 +239,9 @@
creator_name = data["creator_name"]
creator_key = data["creator_key"]
realdate = data["realdate"]
positive_ratings = data["pos_ratings"]
negative_ratings = data["neg_ratings"]
raters = data["raters"]
var/x = data["x"]
var/y = data["y"]
@@ -222,7 +251,10 @@
/obj/structure/chisel_message/examine(mob/user)
..()
user << "<span class='warning'>[hidden_message]</span>"
user << "<span class='notice'>[hidden_message]</span>"
user << "Ratings: <span class='noticealien'>[positive_ratings]</span> <span class='danger'>[negative_ratings]</span>"
if(raters[user.ckey])
user << "<i>You rated this message as [raters[user.ckey]].</i>"
/obj/structure/chisel_message/Destroy()
if(persists)
+1 -1
View File
@@ -292,7 +292,7 @@
/obj/item/weapon/paper/contract/infernal/magic/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
if(!istype(user) || !user.mind)
return -1
user.mind.AddSpell(new /obj/effect/proc_holder/spell/fireball(null))
user.mind.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball(null))
user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
return ..()
+1
View File
@@ -51,6 +51,7 @@
obj_integrity = 200
max_integrity = 200
integrity_failure = 50
resistance_flags = FIRE_PROOF
var/area/area
var/areastring = null
var/obj/item/weapon/stock_parts/cell/cell
+4
View File
@@ -736,6 +736,10 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list ( \
pixel_y = rand(-2,2)
update_icon()
/obj/item/stack/cable_coil/red
item_color = "red"
icon_state = "coil_red"
/obj/item/stack/cable_coil/yellow
item_color = "yellow"
icon_state = "coil_yellow"
+10 -1
View File
@@ -168,6 +168,8 @@
investigate_log("lost power and turned <font color='red'>off</font>","singulo")
log_game("Emitter lost power in ([x],[y],[z])")
return
if(!check_delay())
return FALSE
fire_beam()
/obj/machinery/power/emitter/proc/check_delay()
@@ -175,9 +177,16 @@
return TRUE
return FALSE
/obj/machinery/power/emitter/proc/fire_beam()
/obj/machinery/power/emitter/proc/fire_beam_pulse()
if(!check_delay())
return FALSE
if(state != 2)
return FALSE
if(avail(active_power_usage))
add_load(active_power_usage)
fire_beam()
/obj/machinery/power/emitter/proc/fire_beam()
src.last_shot = world.time
if(src.shot_number < 3)
src.fire_delay = 20
+4 -2
View File
@@ -63,8 +63,10 @@
/obj/singularity/narsie/Bump(atom/A)
forceMove(get_turf(A))
A.narsie_act()
var/turf/T = get_turf(A)
if(T == loc)
T = get_step(A, A.dir) //please don't slam into a window like a bird, nar-sie
forceMove(T)
/obj/singularity/narsie/mezzer()
+4 -4
View File
@@ -90,10 +90,10 @@
if((last_zap + zap_cooldown) > world.time)
return FALSE
last_zap = world.time
var/coeff = (12 - (input_power_multiplier * 3))
coeff = max(coeff, 1)
var/shock_coeff = (5 - input_power_multiplier)
shock_coeff = max(shock_coeff, 1)
var/coeff = (20 - ((input_power_multiplier - 1) * 3))
coeff = max(coeff, 10)
var/shock_coeff = (4 - (input_power_multiplier - 2))
shock_coeff = max(shock_coeff, 2)
var/power = (powernet.avail/coeff)
add_load(power)
playsound(src.loc, 'sound/magic/LightningShock.ogg', 100, 1, extrarange = 5)
+1 -1
View File
@@ -203,7 +203,7 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
else if(isliving(A))
var/dist = get_dist(source, A)
var/mob/living/L = A
if(dist <= zap_range && (dist < closest_dist || !closest_mob) && L.stat != DEAD)
if(dist <= zap_range && (dist < closest_dist || !closest_mob) && L.stat != DEAD && !L.tesla_ignore)
closest_mob = L
closest_atom = A
closest_dist = dist
@@ -23,7 +23,7 @@
projectile_type = /obj/item/projectile/magic/door
/obj/item/ammo_casing/magic/fireball
projectile_type = /obj/item/projectile/magic/fireball
projectile_type = /obj/item/projectile/magic/aoe/fireball
/obj/item/ammo_casing/magic/chaos
projectile_type = /obj/item/projectile/magic
@@ -35,7 +35,6 @@
projectile_type = /obj/item/projectile/magic/arcane_barrage
/obj/item/ammo_casing/magic/chaos/newshot()
projectile_type = pick(typesof(/obj/item/projectile/magic))
..()
/obj/item/ammo_casing/magic/honk
+1
View File
@@ -267,6 +267,7 @@
if(user)
user.update_inv_hands()
feedback_add_details("gun_fired","[src.type]")
return 1
/obj/item/weapon/gun/attack(mob/M as mob, mob/user)
if(user.a_intent == INTENT_HARM) //Flogging
@@ -343,3 +343,16 @@
new /obj/item/stack/cable_coil(get_turf(src), 10)
slung = 0
update_icon()
/obj/item/weapon/gun/ballistic/revolver/reverse //Fires directly at its user... unless the user is a clown, of course.
clumsy_check = 0
/obj/item/weapon/gun/ballistic/revolver/reverse/can_trigger_gun(mob/living/user)
if((user.disabilities & CLUMSY) || (user.mind && user.mind.assigned_role == "Clown"))
return ..()
if(process_fire(user, user, 0, zone_override = "head"))
user.visible_message("<span class='warning'>[user] somehow manages to shoot [user.p_them()]self in the face!</span>", "<span class='userdanger'>You somehow shoot yourself in the face! How the hell?!</span>")
user.emote("scream")
user.drop_item()
user.Weaken(4)
return
@@ -38,6 +38,13 @@
max_charges = 10
recharge_rate = 2
no_den_usage = 1
var/allowed_projectile_types = list(/obj/item/projectile/magic/change, /obj/item/projectile/magic/animate, /obj/item/projectile/magic/resurrection,
/obj/item/projectile/magic/death, /obj/item/projectile/magic/teleport, /obj/item/projectile/magic/door, /obj/item/projectile/magic/aoe/fireball,
/obj/item/projectile/magic/spellblade, /obj/item/projectile/magic/arcane_barrage)
/obj/item/weapon/gun/magic/staff/chaos/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, message = 1, params, zone_override, bonus_spread = 0)
chambered.projectile_type = pick(allowed_projectile_types)
. = ..(target, user, message, params, zone_override, bonus_spread)
/obj/item/weapon/gun/magic/staff/door
name = "staff of door creation"
+82 -47
View File
@@ -17,53 +17,6 @@
var/mob/M = target
M.death(0)
/obj/item/projectile/magic/fireball
name = "bolt of fireball"
icon_state = "fireball"
damage = 10
damage_type = BRUTE
nodamage = 0
//explosion values
var/exp_heavy = 0
var/exp_light = 2
var/exp_flash = 3
var/exp_fire = 2
/obj/item/projectile/magic/fireball/Range()
var/turf/T1 = get_step(src,turn(dir, -45))
var/turf/T2 = get_step(src,turn(dir, 45))
var/turf/T3 = get_step(src,dir)
var/mob/living/L = locate(/mob/living) in T1 //if there's a mob alive in our front right diagonal, we hit it.
if(L && L.stat != DEAD)
Bump(L,1) //Magic Bullet #teachthecontroversy
return
L = locate(/mob/living) in T2
if(L && L.stat != DEAD)
Bump(L,1)
return
L = locate(/mob/living) in T3
if(L && L.stat != DEAD)
Bump(L,1)
return
..()
/obj/item/projectile/magic/fireball/on_hit(target)
. = ..()
var/turf/T = get_turf(target)
explosion(T, -1, exp_heavy, exp_light, exp_flash, 0, flame_range = exp_fire)
if(ismob(target)) //multiple flavors of pain
var/mob/living/M = target
M.take_overall_damage(0,10) //between this 10 burn, the 10 brute, the explosion brute, and the onfire burn, your at about 65 damage if you stop drop and roll immediately
/obj/item/projectile/magic/fireball/infernal
name = "infernal fireball"
exp_heavy = -1
exp_light = -1
exp_flash = 4
exp_fire= 5
/obj/item/projectile/magic/resurrection
name = "bolt of resurrection"
icon_state = "ion"
@@ -387,3 +340,85 @@
nodamage = 0
armour_penetration = 0
flag = "magic"
/obj/item/projectile/magic/aoe
name = "Area Bolt"
desc = "What the fuck does this do?!"
damage = 0
var/proxdet = TRUE
/obj/item/projectile/magic/aoe/Range()
if(proxdet)
var/turf/T1 = get_step(src,turn(dir, -45))
var/turf/T2 = get_step(src,turn(dir, 45))
var/turf/T3 = get_step(src,dir)
var/mob/living/L = locate(/mob/living) in T1 //if there's a mob alive in our front right diagonal, we hit it.
if(L && L.stat != DEAD)
Bump(L,1) //Magic Bullet #teachthecontroversy
return
L = locate(/mob/living) in T2
if(L && L.stat != DEAD)
Bump(L,1)
return
L = locate(/mob/living) in T3
if(L && L.stat != DEAD)
Bump(L,1)
return
..()
/obj/item/projectile/magic/aoe/lightning
name = "lightning bolt"
icon_state = "tesla_projectile" //Better sprites are REALLY needed and appreciated!~
damage = 15
damage_type = BURN
nodamage = 0
speed = 0.3
flag = "magic"
var/tesla_power = 20000
var/tesla_range = 15
var/tesla_boom = FALSE
var/chain
var/mob/living/caster
/obj/item/projectile/magic/aoe/lightning/fire(setAngle)
if(caster)
chain = caster.Beam(src, icon_state = "lightning[rand(1, 12)]", time = INFINITY, maxdistance = INFINITY)
..()
/obj/item/projectile/magic/aoe/lightning/on_hit(target)
. = ..()
tesla_zap(src, tesla_range, tesla_power, tesla_boom)
qdel(src)
/obj/item/projectile/magic/aoe/lightning/Destroy()
qdel(chain)
. = ..()
/obj/item/projectile/magic/aoe/fireball
name = "bolt of fireball"
icon_state = "fireball"
damage = 10
damage_type = BRUTE
nodamage = 0
//explosion values
var/exp_heavy = 0
var/exp_light = 2
var/exp_flash = 3
var/exp_fire = 2
/obj/item/projectile/magic/aoe/fireball/on_hit(target)
. = ..()
var/turf/T = get_turf(target)
explosion(T, -1, exp_heavy, exp_light, exp_flash, 0, flame_range = exp_fire)
if(ismob(target)) //multiple flavors of pain
var/mob/living/M = target
M.take_overall_damage(0,10) //between this 10 burn, the 10 brute, the explosion brute, and the onfire burn, your at about 65 damage if you stop drop and roll immediately
/obj/item/projectile/magic/aoe/fireball/infernal
name = "infernal fireball"
exp_heavy = -1
exp_light = -1
exp_flash = 4
exp_fire= 5
@@ -84,6 +84,15 @@
build_path = /obj/item/weapon/aiModule/reset/purge
category = list("AI Modules")
/datum/design/board/remove_module
name = "Module Design (Law Removal)"
desc = "Allows for the construction of a Law Removal AI Core Module."
id = "remove_module"
req_tech = list("programming" = 5, "materials" = 5)
materials = list(MAT_GLASS = 1000, MAT_DIAMOND = 100)
build_path = /obj/item/weapon/aiModule/remove
category = list("AI Modules")
/datum/design/board/freeformcore_module
name = "AI Core Module (Freeform)"
desc = "Allows for the construction of a Freeform AI Core Module."
@@ -130,11 +139,13 @@
build_path = /obj/item/weapon/aiModule/core/full/corp
category = list("AI Modules")
/datum/design/board/custom_module
name = "Core Module Design (Custom)"
desc = "Allows for the construction of a Custom AI Core Module."
id = "custom_module"
/datum/design/board/default_module
name = "Core Module Design (Default)"
desc = "Allows for the construction of a Default AI Core Module."
id = "default_module"
req_tech = list("programming" = 5, "materials" = 5)
materials = list(MAT_GLASS = 1000, MAT_DIAMOND = 100)
build_path = /obj/item/weapon/aiModule/core/full/custom
category = list("AI Modules")
+1 -1
View File
@@ -344,7 +344,7 @@
if(MT)
visible_message("<span class='danger'>[src] dangerously overheats, launching a flaming fuel orb!</span>")
investigate_log("Experimentor has launched a <font color='red'>fireball</font> at [M]!", "experimentor")
var/obj/item/projectile/magic/fireball/FB = new /obj/item/projectile/magic/fireball(start)
var/obj/item/projectile/magic/aoe/fireball/FB = new /obj/item/projectile/magic/aoe/fireball(start)
FB.original = MT
FB.current = start
FB.yo = MT.y - start.y
+2
View File
@@ -212,6 +212,8 @@
else
return
SSshuttle.emergencyCallAmount++
if(prob(70))
SSshuttle.emergencyLastCallLoc = signalOrigin
else
+15
View File
@@ -11,6 +11,21 @@
return 0
. = ..()
/obj/machinery/atmospherics/onShuttleMove()
. = ..()
for(DEVICE_TYPE_LOOP)
if(get_area(nodes[I]) != get_area(src))
nullifyNode(I)
#define DIR_CHECK_TURF_AREA(X) (get_area(get_ranged_target_turf(src, X, 1)) != A)
/obj/structure/cable/onShuttleMove()
. = ..()
var/A = get_area(src)
//cut cables on the edge
if(DIR_CHECK_TURF_AREA(NORTH) || DIR_CHECK_TURF_AREA(SOUTH) || DIR_CHECK_TURF_AREA(EAST) || DIR_CHECK_TURF_AREA(WEST))
cut_cable_from_powernet()
#undef DIR_CHECK_TURF_AREA
/atom/movable/light/onShuttleMove()
return 0
+2 -2
View File
@@ -316,9 +316,9 @@
I = image("icon"='icons/mob/human_parts.dmi', "icon_state"="[species_id]_[body_zone]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir)
else
if(should_draw_gender)
I = image("icon"='icons/mob/augments.dmi', "icon_state"="[body_zone]_[icon_gender]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir)
I = image("icon"='icons/mob/augments.dmi', "icon_state"="[icon_state]_[icon_gender]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir)
else
I = image("icon"='icons/mob/augments.dmi', "icon_state"="[body_zone]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir)
I = image("icon"='icons/mob/augments.dmi', "icon_state"="[icon_state]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir)
standing += I
return standing
@@ -35,6 +35,8 @@
var/turf/target_turf = get_turf(src)
for(var/i in 1 to t_range-1)
var/turf/new_turf = get_step(target_turf, direction)
if(!new_turf)
break
target_turf = new_turf
if(new_turf.density)
break
@@ -158,3 +158,34 @@
flash2.forceMove(user.loc)
flash2 = null
..()
/obj/item/bodypart/l_arm/robot/surplus
name = "surplus prosthetic left arm"
desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing."
icon = 'icons/mob/augments.dmi'
icon_state = "surplus_l_arm"
max_damage = 20
/obj/item/bodypart/r_arm/robot/surplus
name = "surplus prosthetic right arm"
desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing."
icon = 'icons/mob/augments.dmi'
icon_state = "surplus_r_arm"
max_damage = 20
/obj/item/bodypart/l_leg/robot/surplus
name = "surplus prosthetic leg"
desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing."
icon = 'icons/mob/augments.dmi'
icon_state = "surplus_l_leg"
max_damage = 20
/obj/item/bodypart/r_leg/robot/surplus
name = "surplus prosthetic leg"
desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing."
icon = 'icons/mob/augments.dmi'
icon_state = "surplus_r_leg"
max_damage = 20
@@ -664,6 +664,7 @@
/obj/item/organ/tongue/robot
name = "robotic voicebox"
desc = "A voice synthesizer that can interface with organic lifeforms."
status = ORGAN_ROBOTIC
icon_state = "tonguerobot"
say_mod = "states"
attack_verb = list("beeped", "booped")
@@ -807,6 +808,7 @@
name = "robotic eyes"
icon_state = "cybernetic_eyeballs"
desc = "Your vision is augmented."
status = ORGAN_ROBOTIC
/obj/item/organ/eyes/robotic/emp_act(severity)
if(!owner)
+1 -1
View File
@@ -20,7 +20,7 @@
var/oldname = target.real_name
target.real_name = target.dna.species.random_name(target.gender,1)
var/newname = target.real_name //something about how the code handles names required that I use this instead of target.real_name
user.visible_message("[user] alters [oldname]'s appearance completely, [target.p_they()] are now [newname]!", "<span class='notice'>You alter [oldname]'s appearance completely, [target.p_they()] are now [newname].</span>")
user.visible_message("[user] alters [oldname]'s appearance completely, [target.p_they()] is now [newname]!", "<span class='notice'>You alter [oldname]'s appearance completely, [target.p_they()] is now [newname].</span>")
if(ishuman(target))
var/mob/living/carbon/human/H = target
H.sec_hud_set_ID()
+20
View File
@@ -638,6 +638,7 @@ var/list/uplink_items = list() // Global list so we only initialize this once.
desc = "A highly experimental bioterror agent which creates dormant nodules to be etched into the grey matter of the brain. On death, these nodules take control of the dead body, causing limited revivification, along with slurred speech, aggression, and the ability to infect others with this agent."
item = /obj/item/weapon/storage/box/syndie_kit/romerol
cost = 25
cant_discount = TRUE
exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang)
/datum/uplink_item/stealthy_weapons/dart_pistol
@@ -1166,6 +1167,14 @@ var/list/uplink_items = list() // Global list so we only initialize this once.
category = "Role-Restricted"
exclude_modes = list(/datum/game_mode/nuclear)
/datum/uplink_item/role_restricted/reverse_revolver
name = "Reverse Revolver"
desc = "A revolver that always fires at its user. \"Accidentally\" drop your weapon, then watch as the greedy corporate pigs blow their own brains all over the wall. \
The revolver itself is actually real. Only clumsy people, and clowns, can fire it normally. Honk."
cost = 14
item = /obj/item/weapon/gun/ballistic/revolver/reverse
restricted_roles = list("Clown")
/datum/uplink_item/role_restricted/ez_clean_bundle
name = "EZ Clean Grenade Bundle"
desc = "A box with three cleaner grenades using the trademark Waffle Co. formula. Serves as a cleaner and causes acid damage to anyone standing nearby. The acid only affects carbon-based creatures."
@@ -1174,6 +1183,17 @@ var/list/uplink_items = list() // Global list so we only initialize this once.
surplus = 20
restricted_roles = list("Janitor")
/datum/uplink_item/role_restricted/his_grace
name = "His Grace"
desc = "An incredibly dangerous weapon recovered from a station overcome by the grey tide. Once activated, it will thirst for blood and must be used to kill in order to sate that thirst. \
His Grace grants benefits to its wielder, with a more intense hunger equaling more benefits, but be wary: if it gets too hungry, it will kill you and destroy your body. \
If you leave His Grace alone for some time, it will eventually return to its inactive state. \
To activate His Grace, place five assorted organs inside of it and use it in your hand."
item = /obj/item/weapon/storage/toolbox/artistic/his_grace
cost = 20
restricted_roles = list("Chaplain")
surplus = 5 //Very low chance to get it in a surplus crate even without being the chaplain
// Pointless
/datum/uplink_item/badass
category = "(Pointless) Badassery"
+1 -3
View File
@@ -97,9 +97,7 @@
user << "<span class='warning'>It's on fire!</span>"
var/healthpercent = (obj_integrity/max_integrity) * 100
switch(healthpercent)
if(100 to INFINITY)
user << "It seems pristine and undamaged."
if(50 to 100)
if(50 to 99)
user << "It looks slightly damaged."
if(25 to 50)
user << "It appears heavily damaged."