Merge branch 'master' into development
@@ -134,3 +134,10 @@ Proc for attack log creation, because really why not
|
||||
return 0
|
||||
var/mob/living/silicon/robot/R = thing.loc
|
||||
return (thing in R.module.modules)
|
||||
|
||||
/proc/get_exposed_defense_zone(var/atom/movable/target)
|
||||
var/obj/item/weapon/grab/G = locate() in target
|
||||
if (G && G.state >= GRAB_NECK)
|
||||
return pick("head", "l_hand", "r_hand", "l_foot", "r_foot", "l_arm", "r_arm", "l_leg", "r_leg")
|
||||
else
|
||||
return pick("chest", "groin")
|
||||
|
||||
@@ -318,23 +318,14 @@
|
||||
return
|
||||
|
||||
/mob/living/LaserEyes(atom/A)
|
||||
next_move = world.time + 6
|
||||
var/turf/T = get_turf(src)
|
||||
var/turf/U = get_turf(A)
|
||||
|
||||
var/obj/item/projectile/beam/LE = new /obj/item/projectile/beam( loc )
|
||||
LE.icon = 'icons/effects/genetics.dmi'
|
||||
LE.icon_state = "eyelasers"
|
||||
playsound(usr.loc, 'sound/weapons/taser2.ogg', 75, 1)
|
||||
|
||||
LE.firer = src
|
||||
LE.def_zone = get_organ_target()
|
||||
LE.original = A
|
||||
LE.current = T
|
||||
LE.yo = U.y - T.y
|
||||
LE.xo = U.x - T.x
|
||||
spawn( 1 )
|
||||
LE.process()
|
||||
var/obj/item/projectile/beam/LE = new (T)
|
||||
LE.muzzle_type = /obj/effect/projectile/eyelaser/muzzle
|
||||
LE.tracer_type = /obj/effect/projectile/eyelaser/tracer
|
||||
LE.impact_type = /obj/effect/projectile/eyelaser/impact
|
||||
playsound(usr.loc, 'sound/weapons/wave.ogg', 75, 1)
|
||||
LE.launch(A)
|
||||
|
||||
/mob/living/carbon/human/LaserEyes()
|
||||
if(nutrition>0)
|
||||
@@ -342,7 +333,7 @@
|
||||
nutrition = max(nutrition - rand(1,5),0)
|
||||
handle_regular_hud_updates()
|
||||
else
|
||||
src << "\red You're out of energy! You need food!"
|
||||
src << "<span class='warning'>You're out of energy! You need food!</span>"
|
||||
|
||||
// Simple helper to face what you clicked on, in case it should be needed in more than one place
|
||||
/mob/proc/face_atom(var/atom/A)
|
||||
|
||||
@@ -90,6 +90,7 @@
|
||||
/datum/job/qm
|
||||
title = "Quartermaster"
|
||||
flag = QUARTERMASTER
|
||||
head_position = 1
|
||||
department = "Cargo"
|
||||
department_flag = CIVILIAN
|
||||
faction = "Station"
|
||||
|
||||
@@ -44,8 +44,8 @@
|
||||
spawn_positions = 3
|
||||
supervisors = "the chief medical officer"
|
||||
selection_color = "#ffeef0"
|
||||
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
|
||||
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_virology)
|
||||
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_eva)
|
||||
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_virology, access_eva)
|
||||
alt_titles = list("Surgeon","Emergency Physician","Nurse","Virologist")
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
|
||||
@@ -618,7 +618,6 @@ var/list/turret_icons
|
||||
else
|
||||
A = new projectile(loc)
|
||||
playsound(loc, shot_sound, 75, 1)
|
||||
A.original = target
|
||||
|
||||
// Lethal/emagged turrets use twice the power due to higher energy beams
|
||||
// Emagged turrets again use twice as much power due to higher firing rates
|
||||
@@ -626,19 +625,9 @@ var/list/turret_icons
|
||||
|
||||
//Turrets aim for the center of mass by default.
|
||||
//If the target is grabbing someone then the turret smartly aims for extremities
|
||||
var/obj/item/weapon/grab/G = locate() in target
|
||||
if(G && G.state >= GRAB_NECK) //works because mobs are currently not allowed to upgrade to NECK if they are grabbing two people.
|
||||
A.def_zone = pick("head", "l_hand", "r_hand", "l_foot", "r_foot", "l_arm", "r_arm", "l_leg", "r_leg")
|
||||
else
|
||||
A.def_zone = pick("chest", "groin")
|
||||
var/def_zone = get_exposed_defense_zone(target)
|
||||
|
||||
//Shooting Code:
|
||||
A.current = T
|
||||
A.starting = T
|
||||
A.yo = U.y - T.y
|
||||
A.xo = U.x - T.x
|
||||
spawn(1)
|
||||
A.process()
|
||||
A.launch(target, def_zone)
|
||||
|
||||
/datum/turret_checks
|
||||
var/enabled
|
||||
|
||||
@@ -261,26 +261,17 @@
|
||||
A = new /obj/item/projectile/beam/lastertag/blue( loc )
|
||||
if(6)
|
||||
A = new /obj/item/projectile/beam/lastertag/red( loc )
|
||||
A.original = target
|
||||
use_power(500)
|
||||
else
|
||||
A = new /obj/item/projectile/energy/electrode( loc )
|
||||
use_power(200)
|
||||
|
||||
|
||||
//Turrets aim for the center of mass by default.
|
||||
//If the target is grabbing someone then the turret smartly aims for extremities
|
||||
var/obj/item/weapon/grab/G = locate() in target
|
||||
if(G && G.state >= GRAB_NECK) //works because mobs are currently not allowed to upgrade to NECK if they are grabbing two people.
|
||||
A.def_zone = pick("head", "l_hand", "r_hand", "l_foot", "r_foot", "l_arm", "r_arm", "l_leg", "r_leg")
|
||||
else
|
||||
A.def_zone = pick("chest", "groin")
|
||||
|
||||
A.current = T
|
||||
A.starting = T
|
||||
A.yo = U.y - T.y
|
||||
A.xo = U.x - T.x
|
||||
spawn( 0 )
|
||||
A.process()
|
||||
var/def_zone = get_exposed_defense_zone(target)
|
||||
|
||||
A.launch(target, def_zone)
|
||||
|
||||
return
|
||||
|
||||
|
||||
@@ -507,25 +498,16 @@
|
||||
cur_target = null
|
||||
return
|
||||
src.set_dir(get_dir(src,target))
|
||||
var/turf/targloc = get_turf(target)
|
||||
var/target_x = targloc.x
|
||||
var/target_y = targloc.y
|
||||
var/target_z = targloc.z
|
||||
targloc = null
|
||||
spawn for(var/i=1 to min(projectiles, projectiles_per_shot))
|
||||
if(!src) break
|
||||
var/turf/curloc = get_turf(src)
|
||||
targloc = locate(target_x+GaussRandRound(deviation,1),target_y+GaussRandRound(deviation,1),target_z)
|
||||
if (!targloc || !curloc)
|
||||
continue
|
||||
if (targloc == curloc)
|
||||
continue
|
||||
|
||||
playsound(src, 'sound/weapons/Gunshot.ogg', 50, 1)
|
||||
var/obj/item/projectile/A = new /obj/item/projectile(curloc)
|
||||
src.projectiles--
|
||||
A.current = curloc
|
||||
A.yo = targloc.y - curloc.y
|
||||
A.xo = targloc.x - curloc.x
|
||||
A.process()
|
||||
|
||||
var/def_zone = get_exposed_defense_zone(target)
|
||||
|
||||
A.launch(target, def_zone)
|
||||
sleep(2)
|
||||
return
|
||||
|
||||
@@ -202,7 +202,7 @@
|
||||
return
|
||||
else if(handled)
|
||||
nanomanager.update_uis(src)
|
||||
return // don't smack that machine with your 2 thalers
|
||||
return // don't smack that machine with your 2 credits
|
||||
|
||||
if (I || istype(W, /obj/item/weapon/spacecash))
|
||||
attack_hand(user)
|
||||
@@ -530,12 +530,20 @@
|
||||
if(coin.string_attached)
|
||||
if(prob(50))
|
||||
user << "\blue You successfully pull the coin out before \the [src] could swallow it."
|
||||
src.visible_message("\blue The [src] putters to life, coughing out its 'premium' item after a moment.")
|
||||
playsound(src.loc, 'sound/items/poster_being_created.ogg', 50, 1)
|
||||
else
|
||||
user << "\blue You weren't able to pull the coin out fast enough, the machine ate it, string and all."
|
||||
user << "\red You weren't able to pull the coin out fast enough, the machine ate it, string and all."
|
||||
src.visible_message("\blue The [src] putters to life, coughing out its 'premium' item after a moment.")
|
||||
playsound(src.loc, 'sound/items/poster_being_created.ogg', 50, 1)
|
||||
qdel(coin)
|
||||
coin = null
|
||||
categories &= ~CAT_COIN
|
||||
else
|
||||
src.visible_message("\blue The [src] putters to life, coughing out its 'premium' item after a moment.")
|
||||
playsound(src.loc, 'sound/items/poster_being_created.ogg', 50, 1)
|
||||
qdel(coin)
|
||||
coin = null
|
||||
categories &= ~CAT_COIN
|
||||
|
||||
R.amount--
|
||||
|
||||
@@ -48,14 +48,11 @@
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/proc/Fire(atom/A, atom/target, turf/aimloc)
|
||||
var/obj/item/projectile/P = A
|
||||
P.shot_from = src
|
||||
P.original = target
|
||||
P.starting = P.loc
|
||||
P.current = P.loc
|
||||
P.firer = chassis.occupant
|
||||
P.yo = aimloc.y - P.loc.y
|
||||
P.xo = aimloc.x - P.loc.x
|
||||
P.process()
|
||||
var/def_zone
|
||||
if (chassis && istype(chassis.occupant, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = chassis.occupant
|
||||
def_zone = H.zone_sel.selecting
|
||||
P.launch(target, def_zone)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy
|
||||
name = "general energy weapon"
|
||||
@@ -280,4 +277,4 @@
|
||||
return "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span> [chassis.selected==src?"<b>":"<a href='?src=\ref[chassis];select_equip=\ref[src]'>"][src.name][chassis.selected==src?"</b>":"</a>"]\[[src.projectiles]\]"
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited/rearm()
|
||||
return//Extra bit of security
|
||||
return//Extra bit of security
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
if(contains != 1)
|
||||
return
|
||||
var/obj/item/weapon/spacecash/S = W
|
||||
user.visible_message("<span class='notice'>[user] puts [S.worth] [S.worth > 1 ? "thalers" : "thaler"] into \the [src].</span>")
|
||||
user.visible_message("<span class='notice'>[user] puts [S.worth] [S.worth > 1 ? "credits" : "credit"] into \the [src].</span>")
|
||||
user.drop_from_inventory(S)
|
||||
S.loc = src
|
||||
update_icon()
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
name = "energy glaive"
|
||||
desc = "An energized glaive."
|
||||
icon_state = "eglaive0"
|
||||
active_force = 60
|
||||
active_force = 40
|
||||
active_throwforce = 60
|
||||
active_w_class = 5
|
||||
force = 20
|
||||
|
||||
@@ -18,13 +18,19 @@ var/global/list/cached_icons = list()
|
||||
flags = OPENCONTAINER
|
||||
var/paint_type = "red"
|
||||
|
||||
attack(mob/M as mob, mob/user as mob, def_zone)
|
||||
if(istype(M, /mob/living/))
|
||||
user.visible_message("<span class='warning'>\The [M] has been splashed with something by [user] to no effect!</span>")
|
||||
reagents.trans_to_turf(M.loc, 5)
|
||||
return
|
||||
|
||||
afterattack(turf/simulated/target, mob/user, proximity)
|
||||
if(!proximity) return
|
||||
if(!proximity)
|
||||
return
|
||||
if(istype(target) && reagents.total_volume > 5)
|
||||
user.visible_message("<span class='warning'>\The [target] has been splashed with something by [user]!</span>")
|
||||
reagents.trans_to_turf(target, 5)
|
||||
else
|
||||
return ..()
|
||||
return
|
||||
|
||||
New()
|
||||
if(paint_type && lentext(paint_type) > 0)
|
||||
|
||||
@@ -32,11 +32,6 @@
|
||||
|
||||
/obj/item/weapon/nullrod/attack(mob/M as mob, mob/living/user as mob) //Paste from old-code to decult with a null rod.
|
||||
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been attacked with [src.name] by [user.name] ([user.ckey])</font>")
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] to attack [M.name] ([M.ckey])</font>")
|
||||
|
||||
msg_admin_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||
|
||||
if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
|
||||
user << "<span class='danger'>You don't have the dexterity to do this!</span>"
|
||||
return
|
||||
@@ -47,7 +42,7 @@
|
||||
user.Paralyse(20)
|
||||
return
|
||||
|
||||
if (M.stat !=2 && ishuman(M))
|
||||
if (M.stat !=2 && ishuman(M) && user.a_intent != I_HURT)
|
||||
var/mob/living/K = M
|
||||
if(cult && (K.mind in cult.current_antagonists) && prob(33))
|
||||
if(do_after(user, 15))
|
||||
@@ -55,7 +50,7 @@
|
||||
var/choice = alert(K,"Do you want to give up your goal?","Become cleansed","Resist","Give in")
|
||||
switch(choice)
|
||||
if("Resist")
|
||||
K.visible_message("\red The gaze in [K]'s eyes remains determined.", "\blue You turn away from the light, remaining true to your dark lord. The light burns you due to rejection!")
|
||||
K.visible_message("\red The gaze in [K]'s eyes remains determined.", "\blue You turn away from the light, remaining true to your dark lord. <b>Anathema!</b>")
|
||||
K.say("*scream")
|
||||
K.take_overall_damage(5, 15)
|
||||
if("Give in")
|
||||
@@ -72,6 +67,13 @@
|
||||
user << "<span class='danger'>The rod appears to do nothing.</span>"
|
||||
M.visible_message("<span class='danger'>\The [user] waves \the [src] over \the [M]'s head.</span>")
|
||||
return
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Is being deconverted with the [src.name] by [user.name] ([user.ckey])</font>")
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] to attempt to deconvert [M.name] ([M.ckey])</font>")
|
||||
|
||||
msg_admin_attack("[key_name(user)] attempted to deconvert [key_name(M)] with [src.name] (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/nullrod/afterattack(atom/A, mob/user as mob, proximity)
|
||||
if(!proximity)
|
||||
|
||||
@@ -73,6 +73,13 @@
|
||||
return
|
||||
if(W.loc != user) // This should stop mounted modules ending up outside the module.
|
||||
return
|
||||
if(W.abstract) //Prevents 'abstract' items (such as grabs) from creeping into the material realm.
|
||||
if(istype(W, /obj/item/weapon/grab))
|
||||
var/obj/item/weapon/grab/G = W
|
||||
user << "<span class='notice'>[G.affecting] just doesn't fit!</span>"
|
||||
else
|
||||
user << "<span class='notice'>[W] does not belong there!</span>"
|
||||
return
|
||||
user.drop_item()
|
||||
if(W)
|
||||
W.forceMove(src.loc)
|
||||
|
||||
@@ -420,9 +420,12 @@
|
||||
if(istype(src, /turf/simulated))
|
||||
var/turf/simulated/T = src
|
||||
T.dirt = 0
|
||||
T.color = null
|
||||
for(var/obj/effect/O in src)
|
||||
if(istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay))
|
||||
if(istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay))
|
||||
qdel(O)
|
||||
if(istype(O,/obj/effect/rune))
|
||||
user << "<span class='warning'>\red No matter how well you wash, the bloody symbols remain!</span>"
|
||||
else
|
||||
user << "<span class='warning'>\The [source] is too dry to wash that.</span>"
|
||||
source.reagents.trans_to_turf(src, 1, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly.
|
||||
|
||||
@@ -97,7 +97,7 @@ var/station_name = "NSS Exodus"
|
||||
var/commstation_name = "NMSS Odin"
|
||||
var/game_version = "Baystation12"
|
||||
var/changelog_hash = ""
|
||||
var/game_year = (text2num(time2text(world.realtime, "YYYY")) + 544)
|
||||
var/game_year = (text2num(time2text(world.realtime, "YYYY")) + 442)
|
||||
|
||||
var/going = 1.0
|
||||
var/master_mode = "extended" // "extended"
|
||||
|
||||
@@ -45,7 +45,7 @@ var/global/list/faction_choices = list(
|
||||
"Grayson Manufactories Ltd.",
|
||||
"Aether Atmospherics",
|
||||
"Zeng-Hu Pharmaceuticals",
|
||||
"Hesphaistos Industries"
|
||||
"Hephaestus Industries"
|
||||
)
|
||||
|
||||
var/global/list/religion_choices = list(
|
||||
|
||||
@@ -556,6 +556,32 @@ var/global/list/gear_datums = list()
|
||||
slot = slot_w_uniform
|
||||
allowed_roles = list("Security Officer","Head of Security","Warden")
|
||||
|
||||
//medical scrubs
|
||||
|
||||
/datum/gear/bluescrub
|
||||
display_name = "medical scrubs, blue"
|
||||
path = /obj/item/clothing/under/rank/medical/blue
|
||||
slot = slot_w_uniform
|
||||
cost = 1
|
||||
|
||||
/datum/gear/greenscrub
|
||||
display_name = "medical scrubs, green"
|
||||
path = /obj/item/clothing/under/rank/medical/green
|
||||
slot = slot_w_uniform
|
||||
cost = 1
|
||||
|
||||
/datum/gear/purplescrub
|
||||
display_name = "medical scrubs, purple"
|
||||
path = /obj/item/clothing/under/rank/medical/purple
|
||||
slot = slot_w_uniform
|
||||
cost = 1
|
||||
|
||||
/datum/gear/blackscrub
|
||||
display_name = "medical scrubs, black"
|
||||
path = /obj/item/clothing/under/rank/medical/black
|
||||
slot = slot_w_uniform
|
||||
cost = 1
|
||||
|
||||
// Attachments
|
||||
|
||||
/datum/gear/armband_cargo
|
||||
@@ -600,7 +626,7 @@ var/global/list/gear_datums = list()
|
||||
slot = slot_tie
|
||||
cost = 1
|
||||
|
||||
/datum/gear/armband_science
|
||||
/datum/gear/armband_movement
|
||||
display_name = "armband, synthetic intelligence movement"
|
||||
path = /obj/item/clothing/accessory/armband/movement
|
||||
slot = slot_tie
|
||||
|
||||
@@ -113,20 +113,20 @@
|
||||
/obj/item/clothing/glasses/regular/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/clothing/glasses/hud/health))
|
||||
user.drop_item()
|
||||
del(W)
|
||||
qdel(W)
|
||||
user << "<span class='notice'>You attach a set of medical HUDs to your glasses.</span>"
|
||||
var/turf/T = get_turf(src)
|
||||
new /obj/item/clothing/glasses/hud/health/prescription(T)
|
||||
user.drop_from_inventory(src)
|
||||
del(src)
|
||||
qdel(src)
|
||||
if(istype(W, /obj/item/clothing/glasses/hud/security))
|
||||
user.drop_item()
|
||||
del(W)
|
||||
qdel(W)
|
||||
user << "<span class='notice'>You attach a set of security HUDs to your glasses.</span>"
|
||||
var/turf/T = get_turf(src)
|
||||
new /obj/item/clothing/glasses/hud/security/prescription(T)
|
||||
user.drop_from_inventory(src)
|
||||
del(src)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/clothing/glasses/regular/scanners
|
||||
name = "Scanning Goggles"
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
T.amount = starting_funds
|
||||
if(!source_db)
|
||||
//set a random date, time and location some time over the past few decades
|
||||
T.date = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], 25[rand(10,56)]"
|
||||
T.date = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], 24[rand(10,48)]"
|
||||
T.time = "[rand(0,24)]:[rand(11,59)]"
|
||||
T.source_terminal = "NTGalaxyNet Terminal #[rand(111,1111)]"
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
for(var/datum/money_account/D in all_money_accounts)
|
||||
if(D.account_number == attempt_account_number && !D.suspended)
|
||||
D.money += amount
|
||||
|
||||
|
||||
//create a transaction log entry
|
||||
var/datum/transaction/T = new()
|
||||
T.target_name = source_name
|
||||
@@ -93,9 +93,9 @@
|
||||
T.time = worldtime2text()
|
||||
T.source_terminal = terminal_id
|
||||
D.transaction_log.Add(T)
|
||||
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
return 0
|
||||
|
||||
//this returns the first account datum that matches the supplied accnum/pin combination, it returns null if the combination did not match any account
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/item/weapon/spacecash
|
||||
name = "0 Thaler"
|
||||
desc = "It's worth 0 Thalers."
|
||||
name = "0 credit chip"
|
||||
desc = "It's worth 0 credits."
|
||||
gender = PLURAL
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "spacecash1"
|
||||
@@ -36,13 +36,14 @@
|
||||
h_user.drop_from_inventory(src)
|
||||
h_user.drop_from_inventory(bundle)
|
||||
h_user.put_in_hands(bundle)
|
||||
user << "<span class='notice'>You add [src.worth] Thalers worth of money to the bundles.<br>It holds [bundle.worth] Thalers now.</span>"
|
||||
user << "<span class='notice'>You add [src.worth] credits worth of money to the bundles.<br>It holds [bundle.worth] credits now.</span>"
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/spacecash/bundle
|
||||
name = "pile of thalers"
|
||||
name = "credit chips"
|
||||
icon_state = ""
|
||||
desc = "They are worth 0 Thalers."
|
||||
gender = PLURAL
|
||||
desc = "They are worth 0 credits."
|
||||
worth = 0
|
||||
|
||||
/obj/item/weapon/spacecash/bundle/update_icon()
|
||||
@@ -59,17 +60,17 @@
|
||||
M.Turn(pick(-45, -27.5, 0, 0, 0, 0, 0, 0, 0, 27.5, 45))
|
||||
banknote.transform = M
|
||||
src.overlays += banknote
|
||||
if(num == 0) // Less than one thaler, let's just make it look like 1 for ease
|
||||
if(num == 0) // Less than one credit, let's just make it look like 1 for ease
|
||||
var/image/banknote = image('icons/obj/items.dmi', "spacecash1")
|
||||
var/matrix/M = matrix()
|
||||
M.Translate(rand(-6, 6), rand(-4, 8))
|
||||
M.Turn(pick(-45, -27.5, 0, 0, 0, 0, 0, 0, 0, 27.5, 45))
|
||||
banknote.transform = M
|
||||
src.overlays += banknote
|
||||
src.desc = "They are worth [worth] Thalers."
|
||||
src.desc = "They are worth [worth] credits."
|
||||
|
||||
/obj/item/weapon/spacecash/bundle/attack_self()
|
||||
var/amount = input(usr, "How many Thalers do you want to take? (0 to [src.worth])", "Take Money", 20) as num
|
||||
var/amount = input(usr, "How many credits do you want to take? (0 to [src.worth])", "Take Money", 20) as num
|
||||
amount = round(Clamp(amount, 0, src.worth))
|
||||
if(amount==0) return 0
|
||||
|
||||
@@ -90,51 +91,51 @@
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/spacecash/c1
|
||||
name = "1 Thaler"
|
||||
name = "1 credit chip"
|
||||
icon_state = "spacecash1"
|
||||
desc = "It's worth 1 credit."
|
||||
worth = 1
|
||||
|
||||
/obj/item/weapon/spacecash/c10
|
||||
name = "10 Thaler"
|
||||
name = "10 credit chip"
|
||||
icon_state = "spacecash10"
|
||||
desc = "It's worth 10 Thalers."
|
||||
desc = "It's worth 10 credits."
|
||||
worth = 10
|
||||
|
||||
/obj/item/weapon/spacecash/c20
|
||||
name = "20 Thaler"
|
||||
name = "20 credit chip"
|
||||
icon_state = "spacecash20"
|
||||
desc = "It's worth 20 Thalers."
|
||||
desc = "It's worth 20 credits."
|
||||
worth = 20
|
||||
|
||||
/obj/item/weapon/spacecash/c50
|
||||
name = "50 Thaler"
|
||||
name = "50 credit chip"
|
||||
icon_state = "spacecash50"
|
||||
desc = "It's worth 50 Thalers."
|
||||
desc = "It's worth 50 credits."
|
||||
worth = 50
|
||||
|
||||
/obj/item/weapon/spacecash/c100
|
||||
name = "100 Thaler"
|
||||
name = "100 credit chip"
|
||||
icon_state = "spacecash100"
|
||||
desc = "It's worth 100 Thalers."
|
||||
desc = "It's worth 100 credits."
|
||||
worth = 100
|
||||
|
||||
/obj/item/weapon/spacecash/c200
|
||||
name = "200 Thaler"
|
||||
name = "200 credit chip"
|
||||
icon_state = "spacecash200"
|
||||
desc = "It's worth 200 Thalers."
|
||||
desc = "It's worth 200 credits."
|
||||
worth = 200
|
||||
|
||||
/obj/item/weapon/spacecash/c500
|
||||
name = "500 Thaler"
|
||||
name = "500 credit chip"
|
||||
icon_state = "spacecash500"
|
||||
desc = "It's worth 500 Thalers."
|
||||
desc = "It's worth 500 credits."
|
||||
worth = 500
|
||||
|
||||
/obj/item/weapon/spacecash/c1000
|
||||
name = "1000 Thaler"
|
||||
name = "1000 credit chip"
|
||||
icon_state = "spacecash1000"
|
||||
desc = "It's worth 1000 Thalers."
|
||||
desc = "It's worth 1000 credits."
|
||||
worth = 1000
|
||||
|
||||
proc/spawn_money(var/sum, spawnloc, mob/living/carbon/human/human_user as mob)
|
||||
@@ -160,4 +161,4 @@ proc/spawn_money(var/sum, spawnloc, mob/living/carbon/human/human_user as mob)
|
||||
/obj/item/weapon/spacecash/ewallet/examine(mob/user)
|
||||
..(user)
|
||||
if (!(user in view(2)) && user!=src.loc) return
|
||||
user << "\blue Charge card's owner: [src.owner_name]. Thalers remaining: [src.worth]."
|
||||
user << "\blue Charge card's owner: [src.owner_name]. Credit chips remaining: [src.worth]."
|
||||
|
||||
@@ -112,7 +112,7 @@ var/global/economy_init = 0
|
||||
T.target_name = station_account.owner_name
|
||||
T.purpose = "Account creation"
|
||||
T.amount = 75000
|
||||
T.date = "2nd April, 2555"
|
||||
T.date = "2nd April, 2454"
|
||||
T.time = "11:24"
|
||||
T.source_terminal = "Biesel GalaxyNet Terminal #277"
|
||||
|
||||
@@ -134,7 +134,7 @@ var/global/economy_init = 0
|
||||
T.target_name = department_account.owner_name
|
||||
T.purpose = "Account creation"
|
||||
T.amount = department_account.money
|
||||
T.date = "2nd April, 2555"
|
||||
T.date = "2nd April, 2454"
|
||||
T.time = "11:24"
|
||||
T.source_terminal = "Biesel GalaxyNet Terminal #277"
|
||||
|
||||
|
||||
@@ -28,6 +28,6 @@
|
||||
|
||||
var/body = "Nyx Daily wishes to congratulate <b>[winner_name]</b> for recieving the Nyx Stellar Slam Lottery, and receiving the out of this world sum of [winner_sum] credits!"
|
||||
if(!deposit_success)
|
||||
body += "<br>Unfortunately, we were unable to verify the account details provided, so we were unable to transfer the money. Send a cheque containing the sum of 5000 Thalers to ND 'Stellar Slam' office on the Nyx gateway containing updated details, and your winnings'll be re-sent within the month."
|
||||
body += "<br>Unfortunately, we were unable to verify the account details provided, so we were unable to transfer the money. Send a cheque containing the sum of 5000 credits to ND 'Stellar Slam' office on the Nyx gateway containing updated details, and your winnings'll be re-sent within the month."
|
||||
|
||||
news_network.SubmitArticle(body, author, channel, null, 1)
|
||||
|
||||
@@ -56,8 +56,6 @@
|
||||
return
|
||||
|
||||
last_shot = world.time
|
||||
var/turf/T = get_turf(src)
|
||||
var/turf/U = get_turf(A)
|
||||
|
||||
var/projectile = /obj/item/projectile/beam/stun
|
||||
if(emagged)
|
||||
@@ -65,14 +63,9 @@
|
||||
|
||||
playsound(loc, emagged ? 'sound/weapons/Laser.ogg' : 'sound/weapons/Taser.ogg', 50, 1)
|
||||
var/obj/item/projectile/P = new projectile(loc)
|
||||
var/def_zone = get_exposed_defense_zone(A)
|
||||
P.launch(A, def_zone)
|
||||
|
||||
P.original = A
|
||||
P.starting = T
|
||||
P.current = T
|
||||
P.yo = U.y - T.y
|
||||
P.xo = U.x - T.x
|
||||
spawn()
|
||||
P.process()
|
||||
return
|
||||
|
||||
// Assembly
|
||||
|
||||
@@ -171,29 +171,8 @@
|
||||
|
||||
visible_message("<span class='warning'>[src] spits neurotoxin at [target]!</span>", "<span class='alium'>You spit neurotoxin at [target].</span>")
|
||||
|
||||
//I'm not motivated enough to revise this. Prjectile code in general needs update.
|
||||
// Maybe change this to use throw_at? ~ Z
|
||||
var/turf/T = loc
|
||||
var/turf/U = (istype(target, /atom/movable) ? target.loc : target)
|
||||
|
||||
if(!U || !T)
|
||||
return
|
||||
while(U && !istype(U,/turf))
|
||||
U = U.loc
|
||||
if(!istype(T, /turf))
|
||||
return
|
||||
if (U == T)
|
||||
usr.bullet_act(new /obj/item/projectile/energy/neurotoxin(usr.loc), get_organ_target())
|
||||
return
|
||||
if(!istype(U, /turf))
|
||||
return
|
||||
|
||||
var/obj/item/projectile/energy/neurotoxin/A = new /obj/item/projectile/energy/neurotoxin(usr.loc)
|
||||
A.current = U
|
||||
A.yo = U.y - T.y
|
||||
A.xo = U.x - T.x
|
||||
A.process()
|
||||
return
|
||||
A.launch(target, get_organ_target())
|
||||
|
||||
/mob/living/carbon/human/proc/resin() // -- TLE
|
||||
set name = "Secrete Resin (75)"
|
||||
@@ -217,4 +196,4 @@
|
||||
new /obj/effect/alien/resin/membrane(loc)
|
||||
if("resin nest")
|
||||
new /obj/structure/bed/nest(loc)
|
||||
return
|
||||
return
|
||||
|
||||
@@ -126,6 +126,6 @@ var/global/list/default_pai_software = list()
|
||||
|
||||
else if(href_list["image"])
|
||||
var/img = text2num(href_list["image"])
|
||||
if(1 <= img && img <= 9)
|
||||
if(1 <= img && img <= 15)
|
||||
card.setEmotion(img)
|
||||
return 1
|
||||
|
||||
@@ -925,9 +925,10 @@
|
||||
if (istype(tile, /turf/simulated))
|
||||
var/turf/simulated/S = tile
|
||||
S.dirt = 0
|
||||
S.color = null
|
||||
for(var/A in tile)
|
||||
if(istype(A, /obj/effect))
|
||||
if(istype(A, /obj/effect/rune) || istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/overlay))
|
||||
if(istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/overlay))
|
||||
qdel(A)
|
||||
else if(istype(A, /obj/item))
|
||||
var/obj/item/cleaned_item = A
|
||||
|
||||
@@ -155,22 +155,21 @@
|
||||
var/target = target_mob
|
||||
visible_message("\red <b>[src]</b> fires at [target]!", 1)
|
||||
|
||||
var/tturf = get_turf(target)
|
||||
if(rapid)
|
||||
spawn(1)
|
||||
Shoot(tturf, src.loc, src)
|
||||
Shoot(target, src.loc, src)
|
||||
if(casingtype)
|
||||
new casingtype(get_turf(src))
|
||||
spawn(4)
|
||||
Shoot(tturf, src.loc, src)
|
||||
Shoot(target, src.loc, src)
|
||||
if(casingtype)
|
||||
new casingtype(get_turf(src))
|
||||
spawn(6)
|
||||
Shoot(tturf, src.loc, src)
|
||||
Shoot(target, src.loc, src)
|
||||
if(casingtype)
|
||||
new casingtype(get_turf(src))
|
||||
else
|
||||
Shoot(tturf, src.loc, src)
|
||||
Shoot(target, src.loc, src)
|
||||
if(casingtype)
|
||||
new casingtype
|
||||
|
||||
@@ -187,16 +186,9 @@
|
||||
playsound(user, projectilesound, 100, 1)
|
||||
if(!A) return
|
||||
|
||||
if (!istype(target, /turf))
|
||||
qdel(A)
|
||||
return
|
||||
A.current = target
|
||||
A.starting = get_turf(src)
|
||||
A.original = get_turf(target)
|
||||
A.yo = target:y - start:y
|
||||
A.xo = target:x - start:x
|
||||
spawn( 0 )
|
||||
A.process()
|
||||
var/def_zone = get_exposed_defense_zone(target)
|
||||
A.launch(target, def_zone)
|
||||
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/proc/DestroySurroundings()
|
||||
|
||||
@@ -22,7 +22,7 @@ var/global/datum/robolimb/basic_robolimb
|
||||
icon = 'icons/mob/human_races/cyberlimbs/bishop.dmi'
|
||||
|
||||
/datum/robolimb/hesphaistos
|
||||
company = "Hesphiastos Industries"
|
||||
company = "Hephaestus Industries"
|
||||
desc = "This limb has a militaristic black and green casing with gold stripes."
|
||||
icon = 'icons/mob/human_races/cyberlimbs/hesphaistos.dmi'
|
||||
|
||||
|
||||
@@ -129,27 +129,16 @@
|
||||
//need to calculate the power per shot as the emitter doesn't fire continuously.
|
||||
var/burst_time = (min_burst_delay + max_burst_delay)/2 + 2*(burst_shots-1)
|
||||
var/power_per_shot = active_power_usage * (burst_time/10) / burst_shots
|
||||
var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc )
|
||||
A.damage = round(power_per_shot/EMITTER_DAMAGE_POWER_TRANSFER)
|
||||
|
||||
playsound(src.loc, 'sound/weapons/emitter.ogg', 25, 1)
|
||||
if(prob(35))
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
A.set_dir(src.dir)
|
||||
A.starting = get_turf(src)
|
||||
switch(dir)
|
||||
if(NORTH)
|
||||
A.original = locate(x, y+1, z)
|
||||
if(EAST)
|
||||
A.original = locate(x+1, y, z)
|
||||
if(WEST)
|
||||
A.original = locate(x-1, y, z)
|
||||
else // Any other
|
||||
A.original = locate(x, y-1, z)
|
||||
A.process()
|
||||
|
||||
var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc )
|
||||
playsound(src.loc, 'sound/weapons/emitter.ogg', 25, 1)
|
||||
A.damage = round(power_per_shot/EMITTER_DAMAGE_POWER_TRANSFER)
|
||||
A.launch(get_step(src.loc, src.dir))
|
||||
|
||||
/obj/machinery/power/emitter/attackby(obj/item/W, mob/user)
|
||||
|
||||
@@ -235,4 +224,4 @@
|
||||
return
|
||||
|
||||
..()
|
||||
return
|
||||
return
|
||||
|
||||
@@ -119,6 +119,18 @@
|
||||
/obj/effect/projectile/stun/impact
|
||||
icon_state = "impact_stun"
|
||||
|
||||
//----------------------------
|
||||
// Eye beam
|
||||
//----------------------------
|
||||
/obj/effect/projectile/eyelaser/tracer
|
||||
icon_state = "eye"
|
||||
|
||||
/obj/effect/projectile/eyelaser/muzzle
|
||||
icon_state = "muzzle_eye"
|
||||
|
||||
/obj/effect/projectile/eyelaser/impact
|
||||
icon_state = "impact_eye"
|
||||
|
||||
//----------------------------
|
||||
// Bullet
|
||||
//----------------------------
|
||||
|
||||
@@ -323,7 +323,7 @@
|
||||
y_offset = rand(-1,1)
|
||||
x_offset = rand(-1,1)
|
||||
|
||||
return !P.launch(target, user, src, target_zone, x_offset, y_offset)
|
||||
return !P.launch_from_gun(target, user, src, target_zone, x_offset, y_offset)
|
||||
|
||||
//Suicide handling.
|
||||
/obj/item/weapon/gun/var/mouthshoot = 0 //To stop people from suiciding twice... >.>
|
||||
|
||||
@@ -114,21 +114,13 @@
|
||||
p_x = between(0, p_x + rand(-radius, radius), world.icon_size)
|
||||
p_y = between(0, p_y + rand(-radius, radius), world.icon_size)
|
||||
|
||||
//called to launch a projectile from a gun
|
||||
/obj/item/projectile/proc/launch(atom/target, mob/user, obj/item/weapon/gun/launcher, var/target_zone, var/x_offset=0, var/y_offset=0)
|
||||
var/turf/curloc = get_turf(user)
|
||||
//called to launch a projectile
|
||||
/obj/item/projectile/proc/launch(atom/target, var/target_zone, var/x_offset=0, var/y_offset=0, var/angle_offset=0)
|
||||
var/turf/curloc = get_turf(src)
|
||||
var/turf/targloc = get_turf(target)
|
||||
if (!istype(targloc) || !istype(curloc))
|
||||
return 1
|
||||
|
||||
firer = user
|
||||
def_zone = target_zone
|
||||
|
||||
if(user == target) //Shooting yourself
|
||||
user.bullet_act(src, target_zone)
|
||||
on_impact(user)
|
||||
qdel(src)
|
||||
return 0
|
||||
if(targloc == curloc) //Shooting something in the same turf
|
||||
target.bullet_act(src, target_zone)
|
||||
on_impact(target)
|
||||
@@ -136,31 +128,38 @@
|
||||
return 0
|
||||
|
||||
original = target
|
||||
loc = curloc
|
||||
starting = curloc
|
||||
current = curloc
|
||||
yo = targloc.y - curloc.y + y_offset
|
||||
xo = targloc.x - curloc.x + x_offset
|
||||
|
||||
shot_from = launcher
|
||||
silenced = launcher.silenced
|
||||
def_zone = target_zone
|
||||
|
||||
spawn()
|
||||
setup_trajectory(curloc, targloc, x_offset, y_offset, angle_offset) //plot the initial trajectory
|
||||
process()
|
||||
|
||||
return 0
|
||||
|
||||
//called to launch a projectile from a gun
|
||||
/obj/item/projectile/proc/launch_from_gun(atom/target, mob/user, obj/item/weapon/gun/launcher, var/target_zone, var/x_offset=0, var/y_offset=0)
|
||||
if(user == target) //Shooting yourself
|
||||
user.bullet_act(src, target_zone)
|
||||
qdel(src)
|
||||
return 0
|
||||
|
||||
loc = get_turf(user) //move the projectile out into the world
|
||||
|
||||
firer = user
|
||||
shot_from = launcher.name
|
||||
silenced = launcher.silenced
|
||||
|
||||
return launch(target, target_zone, x_offset, y_offset)
|
||||
|
||||
//Used to change the direction of the projectile in flight.
|
||||
/obj/item/projectile/proc/redirect(var/new_x, var/new_y, var/atom/starting_loc, var/mob/new_firer=null)
|
||||
original = locate(new_x, new_y, src.z)
|
||||
starting = starting_loc
|
||||
current = starting_loc
|
||||
var/turf/new_target = locate(new_x, new_y, src.z)
|
||||
|
||||
original = new_target
|
||||
if(new_firer)
|
||||
firer = src
|
||||
|
||||
yo = new_y - starting_loc.y
|
||||
xo = new_x - starting_loc.x
|
||||
setup_trajectory()
|
||||
setup_trajectory(starting_loc, new_target)
|
||||
|
||||
//Called when the projectile intercepts a mob. Returns 1 if the projectile hit the mob, 0 if it missed and should keep flying.
|
||||
/obj/item/projectile/proc/attack_mob(var/mob/living/target_mob, var/distance, var/miss_modifier=0)
|
||||
@@ -177,14 +176,15 @@
|
||||
result = target_mob.bullet_act(src, def_zone)
|
||||
|
||||
if(result == PROJECTILE_FORCE_MISS && (can_miss == 0)) //if you're shooting at point blank you can't miss.
|
||||
visible_message("<span class='notice'>\The [src] misses [target_mob] narrowly!</span>")
|
||||
if(!silenced)
|
||||
target_mob.visible_message("<span class='notice'>\The [src] misses [target_mob] narrowly!</span>")
|
||||
return 0
|
||||
|
||||
//hit messages
|
||||
if(silenced)
|
||||
target_mob << "<span class='danger'>You've been hit in the [parse_zone(def_zone)] by \the [src]!</span>"
|
||||
else
|
||||
visible_message("<span class='danger'>\The [target_mob] is hit by \the [src] in the [parse_zone(def_zone)]!</span>")//X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter
|
||||
target_mob.visible_message("<span class='danger'>\The [target_mob] is hit by \the [src] in the [parse_zone(def_zone)]!</span>")//X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter
|
||||
|
||||
//admin logs
|
||||
if(!no_attack_log)
|
||||
@@ -268,20 +268,15 @@
|
||||
qdel(src)
|
||||
return 1
|
||||
|
||||
/obj/item/projectile/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
if(air_group || (height==0)) return 1
|
||||
/obj/item/projectile/ex_act()
|
||||
return //explosions probably shouldn't delete projectiles
|
||||
|
||||
if(istype(mover, /obj/item/projectile))
|
||||
return prob(95) //ha
|
||||
else
|
||||
return 1
|
||||
/obj/item/projectile/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
return 1
|
||||
|
||||
/obj/item/projectile/process()
|
||||
var/first_step = 1
|
||||
|
||||
//plot the initial trajectory
|
||||
setup_trajectory()
|
||||
|
||||
spawn while(src && src.loc)
|
||||
if(kill_count-- < 1)
|
||||
on_impact(src.loc) //for any final impact behaviours
|
||||
@@ -319,9 +314,15 @@
|
||||
sleep(step_delay) //add delay between movement iterations if it's not a hitscan weapon
|
||||
|
||||
/obj/item/projectile/proc/before_move()
|
||||
return
|
||||
return 0
|
||||
|
||||
/obj/item/projectile/proc/setup_trajectory(turf/startloc, turf/targloc, var/x_offset = 0, var/y_offset = 0)
|
||||
// setup projectile state
|
||||
starting = startloc
|
||||
current = startloc
|
||||
yo = targloc.y - startloc.y + y_offset
|
||||
xo = targloc.x - startloc.x + x_offset
|
||||
|
||||
/obj/item/projectile/proc/setup_trajectory()
|
||||
// trajectory dispersion
|
||||
var/offset = 0
|
||||
if(dispersion)
|
||||
@@ -380,7 +381,6 @@
|
||||
invisibility = 101 //Nope! Can't see me!
|
||||
yo = null
|
||||
xo = null
|
||||
var/target = null
|
||||
var/result = 0 //To pass the message back to the gun.
|
||||
|
||||
/obj/item/projectile/test/Bump(atom/A as mob|obj|turf|area)
|
||||
@@ -395,25 +395,24 @@
|
||||
result = 1
|
||||
return
|
||||
|
||||
/obj/item/projectile/test/process()
|
||||
/obj/item/projectile/test/launch(atom/target)
|
||||
var/turf/curloc = get_turf(src)
|
||||
var/turf/targloc = get_turf(target)
|
||||
if(!curloc || !targloc)
|
||||
return 0
|
||||
yo = targloc.y - curloc.y
|
||||
xo = targloc.x - curloc.x
|
||||
target = targloc
|
||||
|
||||
original = target
|
||||
starting = curloc
|
||||
|
||||
//plot the initial trajectory
|
||||
setup_trajectory()
|
||||
setup_trajectory(curloc, targloc)
|
||||
return process(targloc)
|
||||
|
||||
/obj/item/projectile/test/process(var/turf/targloc)
|
||||
while(src) //Loop on through!
|
||||
if(result)
|
||||
return (result - 1)
|
||||
if((!( target ) || loc == target))
|
||||
target = locate(min(max(x + xo, 1), world.maxx), min(max(y + yo, 1), world.maxy), z) //Finding the target turf at map edge
|
||||
if((!( targloc ) || loc == targloc))
|
||||
targloc = locate(min(max(x + xo, 1), world.maxx), min(max(y + yo, 1), world.maxy), z) //Finding the target turf at map edge
|
||||
|
||||
trajectory.increment() // increment the current location
|
||||
location = trajectory.return_location(location) // update the locally stored location data
|
||||
@@ -424,18 +423,22 @@
|
||||
if(istype(M)) //If there is someting living...
|
||||
return 1 //Return 1
|
||||
else
|
||||
M = locate() in get_step(src,target)
|
||||
M = locate() in get_step(src,targloc)
|
||||
if(istype(M))
|
||||
return 1
|
||||
|
||||
/proc/check_trajectory(atom/target as mob|obj, atom/firer as mob|obj, var/pass_flags=PASSTABLE|PASSGLASS|PASSGRILLE, flags=null) //Checks if you can hit them or not.
|
||||
//Helper proc to check if you can hit them or not.
|
||||
/proc/check_trajectory(atom/target as mob|obj, atom/firer as mob|obj, var/pass_flags=PASSTABLE|PASSGLASS|PASSGRILLE, flags=null)
|
||||
if(!istype(target) || !istype(firer))
|
||||
return 0
|
||||
|
||||
var/obj/item/projectile/test/trace = new /obj/item/projectile/test(get_turf(firer)) //Making the test....
|
||||
trace.target = target
|
||||
|
||||
//Set the flags and pass flags to that of the real projectile...
|
||||
if(!isnull(flags))
|
||||
trace.flags = flags //Set the flags...
|
||||
trace.pass_flags = pass_flags //And the pass flags to that of the real projectile...
|
||||
var/output = trace.process() //Test it!
|
||||
trace.flags = flags
|
||||
trace.pass_flags = pass_flags
|
||||
|
||||
var/output = trace.launch(target) //Test it!
|
||||
qdel(trace) //No need for it anymore
|
||||
return output //Send it back to the gun!
|
||||
|
||||
@@ -110,7 +110,7 @@
|
||||
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
|
||||
kill_count = 100
|
||||
embed = 0
|
||||
incinerate = 40
|
||||
// incinerate = 40
|
||||
weaken = 5
|
||||
stun = 5
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
return
|
||||
|
||||
else
|
||||
trans = reagents.splash(target, amount_per_transfer_from_this) //sprinkling reagents on generic non-mobs
|
||||
trans = reagents.trans_to_obj(target, amount_per_transfer_from_this) //sprinkling reagents on generic non-mobs
|
||||
user << "<span class='notice'>You transfer [trans] units of the solution.</span>"
|
||||
|
||||
else // Taking from something
|
||||
|
||||
@@ -1266,14 +1266,14 @@ datum/design/item/implant/AssembleDesignName()
|
||||
..()
|
||||
name = "Implantable biocircuit design ([item_name])"
|
||||
|
||||
/* // Removal of loyalty implants. Can't think of a way to add this to the config option.
|
||||
// Removal of loyalty implants. Can't think of a way to add this to the config option.
|
||||
datum/design/item/implant/loyalty
|
||||
name = "loyalty"
|
||||
id = "implant_loyal"
|
||||
req_tech = list("materials" = 2, "biotech" = 3)
|
||||
materials = list("$metal" = 7000, "$glass" = 7000)
|
||||
build_path = /obj/item/weapon/implantcase/loyalty"
|
||||
*/
|
||||
build_path = /obj/item/weapon/implantcase/loyalty
|
||||
|
||||
|
||||
datum/design/item/implant/chemical
|
||||
name = "chemical"
|
||||
@@ -1344,15 +1344,15 @@ datum/design/item/weapon/rapidsyringe
|
||||
req_tech = list("combat" = 3, "materials" = 3, "engineering" = 3, "biotech" = 2)
|
||||
materials = list("$metal" = 5000, "$glass" = 1000)
|
||||
build_path = /obj/item/weapon/gun/launcher/syringe/rapid
|
||||
/*
|
||||
|
||||
datum/design/item/weapon/largecrossbow
|
||||
name = "Energy Crossbow"
|
||||
desc = "A weapon favoured by syndicate infiltration teams."
|
||||
id = "largecrossbow"
|
||||
req_tech = list("combat" = 4, "materials" = 5, "engineering" = 3, "biotech" = 4, "syndicate" = 3)
|
||||
materials = list("$metal" = 5000, "$glass" = 1000, "$uranium" = 1000, "$silver" = 1000)
|
||||
build_path = /obj/item/weapon/gun/energy/crossbow/largecrossbow"
|
||||
*/
|
||||
build_path = /obj/item/weapon/gun/energy/crossbow/largecrossbow
|
||||
|
||||
datum/design/item/weapon/temp_gun
|
||||
desc = "A gun that shoots high-powered glass-encased energy temperature bullets."
|
||||
id = "temp_gun"
|
||||
@@ -1387,6 +1387,14 @@ datum/design/item/weapon/ammo_9mm
|
||||
materials = list("$metal" = 3750, "$silver" = 100)
|
||||
build_path = /obj/item/ammo_magazine/c9mm
|
||||
|
||||
datum/design/item/weapon/trod
|
||||
id = "trod"
|
||||
name = "tungsten rod pack"
|
||||
desc = "moderately expensive superdense tungsten rods."
|
||||
req_tech = list("combat" = 2, "materials" = 4)
|
||||
materials = list("$metal" = 10000, "$gold" = 3750)
|
||||
build_path = /obj/item/ammo_magazine/trodpack
|
||||
|
||||
datum/design/item/weapon/stunshell
|
||||
desc = "A stunning shell for a shotgun."
|
||||
id = "stunshell"
|
||||
@@ -1400,13 +1408,44 @@ datum/design/item/weapon/phoronpistol
|
||||
materials = list("$metal" = 5000, "$glass" = 1000, "$phoron" = 3000)
|
||||
build_path = /obj/item/weapon/gun/energy/toxgun
|
||||
|
||||
datum/design/item/weapon/eglaive
|
||||
id = "eglaive"
|
||||
name = "energy glaive"
|
||||
desc = "A Li'idra designed hardlight glaive reverse-engineered from schematics found amongst raider wreckages."
|
||||
req_tech = list("combat" = 6, "phorontech" = 4, "materials" = 7, "syndicate" = 4,"powerstorage" = 4)
|
||||
materials = list("$metal" = 10000, "$glass" = 18750, "$phoron" = 3000, "$silver" = 7500)
|
||||
build_path = /obj/item/weapon/melee/energy/glaive
|
||||
|
||||
datum/design/item/weapon/gatlinglaser
|
||||
id = "gatlinglaser"
|
||||
name = "gatling laser"
|
||||
desc = "A higly sophisticated rapid-fire laser weapon."
|
||||
req_tech = list("combat" = 6, "phorontech" = 6, "materials" = 4, "powerstorage" = 3)
|
||||
materials = list("$metal" = 18750, "$glass" = 7500, "$phoron" = 7500, "$silver" = 7500, "$diamond" = 3000)
|
||||
build_path = /obj/item/weapon/gun/energy/vaurca/gatlinglaser
|
||||
|
||||
datum/design/item/weapon/railgun
|
||||
id = "railgun"
|
||||
name = "railgun"
|
||||
desc = "An advanced rifle that magnetically propels hyperdense rods at breakneck speeds to devastating effect."
|
||||
req_tech = list("combat" = 8, "phorontech" = 2, "materials" = 8, "magnets" = 4, "powerstorage" = 5, "syndicate" = 3)
|
||||
materials = list("$metal" = 75000, "$glass" = 18750, "$phoron" = 11250, "$gold" = 7500, "$silver" = 7500)
|
||||
build_path = /obj/item/weapon/gun/projectile/automatic/railgun
|
||||
|
||||
datum/design/item/weapon/zorablaster
|
||||
id = "zorablaster"
|
||||
name = "zo'ra blaster"
|
||||
desc = "A personal defense weapon reverse-engineered from schematics aboard Titan Prime."
|
||||
req_tech = list("combat" = 2, "phorontech" = 4, "materials" = 2)
|
||||
materials = list("$metal" = 8000, "$glass" = 2000, "$phoron" = 6000)
|
||||
build_path = /obj/item/weapon/gun/energy/vaurca/blaster
|
||||
|
||||
datum/design/item/weapon/lawgiver
|
||||
desc = "A highly advanced firearm for the modern police force. It has multiple voice-activated firing modes."
|
||||
id = "lawgiver"
|
||||
req_tech = list("combat" = 6, "plasmatech" = 4, "bluespace" = 5, "materials" = 7)
|
||||
req_tech = list("combat" = 6, "phorontech" = 4, "bluespace" = 5, "materials" = 7)
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 6000, "$glass" = 1000, "$uranium" = 1000, "$plasma" = 1000, "$diamond" = 3000)
|
||||
materials = list("$metal" = 6000, "$glass" = 1000, "$uranium" = 1000, "$phoron" = 1000, "$diamond" = 3000)
|
||||
build_path = "/obj/item/weapon/gun/energy/lawgiver"
|
||||
|
||||
/*This is all the station gets for producable force gloves. It's a high-risk item and thus considered contraband
|
||||
|
||||
@@ -56,6 +56,34 @@
|
||||
|
||||
-->
|
||||
<div class="commit sansserif">
|
||||
<h2 class="date">10 July 2016</h2>
|
||||
<h3 class="author">Alberyk updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Science armbands should be available again in the custom loadout.</li>
|
||||
<li class="rscadd">Added medical scrubs to the custom loadout.</li>
|
||||
<li class="imageadd">Workboots should have a better sprite.</li>
|
||||
</ul>
|
||||
<h3 class="author">LordFowl updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Various weapons added by the last patch are properly included in RnD research.</li>
|
||||
<li class="bugfix">Game year is set properly to 2458.</li>
|
||||
<li class="bugfix">Wizard laser eyes via mutate now work properly.</li>
|
||||
<li class="bugfix">Brig exit door in security now functions appropriately.</li>
|
||||
<li class="bugfix">Arrivals maintainence disposals now functions properly.</li>
|
||||
<li class="bugfix">Doctors now have the appropriate access to EVA.</li>
|
||||
<li class="bugfix">Abstract items such as grabs can no longer be placed into crates.</li>
|
||||
<li class="bugfix">The chaplain's null rod can be used properly as a weapon if intent is set to harm.</li>
|
||||
<li class="bugfix">Droppers now appropriately display transferred units.</li>
|
||||
<li class="bugfix">All pAI faces can now be selected.</li>
|
||||
<li class="bugfix">Soaps, janiborgs, and mops can no longer remove cultist runes.</li>
|
||||
<li class="bugfix">Soaps, janiborgs, and mops can remove paint applicated via paint-can from turfs.</li>
|
||||
<li class="bugfix">All instances of Thaler have been replaced with credit chip.</li>
|
||||
<li class="bugfix">All instances of Hesphaistos have been replaced with Hesphaestus.</li>
|
||||
<li class="tweak">Mechanics of the coin slightly tweaked to prevent duping exploits.</li>
|
||||
<li class="tweak">Mobs can no longer be painted via paint-cans.</li>
|
||||
<li class="rscadd">Quartermasters now start with the cargo account details in their memory notes.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">05 July 2016</h2>
|
||||
<h3 class="author">Alberyk updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
|
||||
@@ -2141,3 +2141,29 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
|
||||
to
|
||||
- bugfix: Mice can no longer spawn in breached areas and die immediately. A spawnpoint
|
||||
with a safe environment will always be chosen
|
||||
2016-07-10:
|
||||
Alberyk:
|
||||
- bugfix: Science armbands should be available again in the custom loadout.
|
||||
- rscadd: Added medical scrubs to the custom loadout.
|
||||
- imageadd: Workboots should have a better sprite.
|
||||
LordFowl:
|
||||
- bugfix: Various weapons added by the last patch are properly included in RnD research.
|
||||
- bugfix: Game year is set properly to 2458.
|
||||
- bugfix: Wizard laser eyes via mutate now work properly.
|
||||
- bugfix: Brig exit door in security now functions appropriately.
|
||||
- bugfix: Arrivals maintainence disposals now functions properly.
|
||||
- bugfix: Doctors now have the appropriate access to EVA.
|
||||
- bugfix: Abstract items such as grabs can no longer be placed into crates.
|
||||
- bugfix: The chaplain's null rod can be used properly as a weapon if intent is
|
||||
set to harm.
|
||||
- bugfix: Droppers now appropriately display transferred units.
|
||||
- bugfix: All pAI faces can now be selected.
|
||||
- bugfix: Soaps, janiborgs, and mops can no longer remove cultist runes.
|
||||
- bugfix: Soaps, janiborgs, and mops can remove paint applicated via paint-can from
|
||||
turfs.
|
||||
- bugfix: All instances of Thaler have been replaced with credit chip.
|
||||
- bugfix: All instances of Hesphaistos have been replaced with Hesphaestus.
|
||||
- tweak: Mechanics of the coin slightly tweaked to prevent duping exploits.
|
||||
- tweak: Mobs can no longer be painted via paint-cans.
|
||||
- rscadd: Quartermasters now start with the cargo account details in their memory
|
||||
notes.
|
||||
|
||||
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 62 KiB |
@@ -642,7 +642,7 @@
|
||||
"amr" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor,/area/security/prison)
|
||||
"ams" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/prison)
|
||||
"amt" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 8; icon_state = "rightsecure"; req_access = list(2)},/obj/structure/table/steel_reinforced,/turf/simulated/floor,/area/security/brig)
|
||||
"amu" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/machinery/button/remote/airlock{id = "prisonentry"; name = "Entry Doors"; pixel_x = -6; pixel_y = 24; req_access = list(2)},/obj/machinery/button/remote/blast_door{id = "prisonexit"; name = "Exit Doors"; pixel_x = 6; pixel_y = 24; req_access = list(2)},/obj/machinery/button/flasher{id = "permentryflash"; name = "entry flash"; pixel_x = -26; pixel_y = 6; req_access = list(2)},/turf/simulated/floor,/area/security/brig)
|
||||
"amu" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/machinery/button/remote/airlock{id = "prisonexit"; name = "Exit Doors"; pixel_x = 6; pixel_y = 24; req_access = list(2)},/obj/machinery/button/flasher{id = "permentryflash"; name = "entry flash"; pixel_x = -26; pixel_y = 6; req_access = list(2)},/obj/machinery/button/remote/airlock{id = "prisonentry"; name = "Entry Doors"; pixel_x = -6; pixel_y = 24; req_access = list(2)},/turf/simulated/floor,/area/security/brig)
|
||||
"amv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/brig)
|
||||
"amw" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/machinery/button/remote/airlock{desc = "A remote control switch for the brig foyer."; id = "BrigFoyer"; name = "Brig Foyer Doors"; pixel_x = 28; pixel_y = -15},/turf/simulated/floor,/area/security/brig)
|
||||
"amx" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/door/window/eastleft{req_access = list(63)},/obj/structure/table/steel_reinforced,/turf/simulated/floor,/area/security/lobby)
|
||||
@@ -3273,7 +3273,7 @@
|
||||
"bkW" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_dock_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft)
|
||||
"bkX" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "specops_dock_airlock"; name = "interior access button"; pixel_x = -28; pixel_y = 26; req_one_access = list(13)},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/turf/simulated/floor,/area/hallway/secondary/entry/aft)
|
||||
"bkY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/power/apc/high{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green,/turf/simulated/floor,/area/hallway/secondary/entry/aft)
|
||||
"bkZ" = (/obj/effect/decal/cleanable/cobweb,/obj/machinery/conveyor,/turf/simulated/floor/plating,/area/maintenance/disposal)
|
||||
"bkZ" = (/obj/effect/decal/cleanable/cobweb,/obj/machinery/conveyor{dir = 1; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal)
|
||||
"bla" = (/obj/machinery/conveyor{dir = 4; id = "garbage"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/disposal)
|
||||
"blb" = (/obj/machinery/conveyor{dir = 4; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal)
|
||||
"blc" = (/obj/structure/disposaloutlet{dir = 8},/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal)
|
||||
|
||||