Merge branch 'master' into midnight-fluffles

This commit is contained in:
FlattestGuitar
2017-05-29 15:37:40 +02:00
385 changed files with 2442 additions and 2226 deletions

View File

@@ -0,0 +1,2 @@
#define CALLBACK new /datum/callback
#define INVOKE_ASYNC ImmediateInvokeAsync

View File

@@ -70,3 +70,6 @@
#define WEAPON_LIGHT 0
#define WEAPON_MEDIUM 1
#define WEAPON_HEAVY 2
// Embedded objects
#define EMBED_THROWSPEED_THRESHOLD 15

View File

@@ -77,11 +77,12 @@
#define SAFE 16
//flags for pass_flags
#define PASSTABLE 1
#define PASSGLASS 2
#define PASSGRILLE 4
#define PASSBLOB 8
#define PASSMOB 16
#define PASSTABLE 1
#define PASSGLASS 2
#define PASSGRILLE 4
#define PASSBLOB 8
#define PASSMOB 16
#define LETPASSTHROW 32
//turf-only flags
#define NOJAUNT 1

View File

@@ -329,4 +329,7 @@
#define TENDRIL_CLEAR_SCORE "Tendrils Killed"
// The number of station goals generated each round.
#define STATION_GOAL_BUDGET 1
#define STATION_GOAL_BUDGET 1
#define FIRST_DIAG_STEP 1
#define SECOND_DIAG_STEP 2

View File

@@ -47,7 +47,7 @@
#define HUMAN_STRIP_DELAY 40 //takes 40ds = 4s to strip someone.
#define ALIEN_SELECT_AFK_BUFFER 1 // How many minutes that a person can be AFK before not being allowed to be an alien.
#define SHOES_SLOWDOWN -1.0 // How much shoes slow you down by default. Negative values speed you up
#define SHOES_SLOWDOWN 0 // How much shoes slow you down by default. Negative values speed you up
//Mob attribute defaults.

View File

@@ -23,7 +23,7 @@
* If you are in the same turf, always true
* If you are vertically/horizontally adjacent, ensure there are no border objects
* If you are diagonally adjacent, ensure you can pass through at least one of the mutually adjacent square.
* Passing through in this case ignores anything with the throwpass flag, such as tables, racks, and morgue trays.
* Passing through in this case ignores anything with the LETPASSTHROW flag, such as tables, racks, and morgue trays.
*/
/turf/Adjacent(var/atom/neighbor, var/atom/target = null)
var/turf/T0 = get_turf(neighbor)
@@ -82,26 +82,18 @@
/*
This checks if you there is uninterrupted airspace between that turf and this one.
This is defined as any dense ON_BORDER object, or any dense object without throwpass.
This is defined as any dense ON_BORDER object, or any dense object without LETPASSTHROW.
The border_only flag allows you to not objects (for source and destination squares)
*/
/turf/proc/ClickCross(var/target_dir, var/border_only, var/target_atom = null)
for(var/obj/O in src)
if( !O.density || O == target_atom || O.throwpass) continue // throwpass is used for anything you can click through
if( !O.density || O == target_atom || (O.pass_flags & LETPASSTHROW))
continue // LETPASSTHROW is used for anything you can click through
if( O.flags&ON_BORDER) // windows have throwpass but are on border, check them first
if( O.flags&ON_BORDER) // windows are on border, check them first
if( O.dir & target_dir || O.dir&(O.dir-1) ) // full tile windows are just diagonals mechanically
return 0
else if( !border_only ) // dense, not on border, cannot pass over
return 0
return 1
/*
Aside: throwpass does not do what I thought it did originally, and is only used for checking whether or not
a thrown object should stop after already successfully entering a square. Currently the throw code involved
only seems to affect hitting mobs, because the checks performed against objects are already performed when
entering or leaving the square. Since throwpass isn't used on mobs, but only on objects, it is effectively
useless. Throwpass may later need to be removed and replaced with a passcheck (bitfield on movable atom passflags).
Since I don't want to complicate the click code rework by messing with unrelated systems it won't be changed here.
*/
return 1

View File

@@ -0,0 +1,53 @@
var/global/datum/controller/process/spacedrift/drift_master
/datum/controller/process/spacedrift
var/list/processing_list = list()
/datum/controller/process/spacedrift/setup()
name = "spacedrift"
schedule_interval = 5
start_delay = 20
log_startup_progress("Spacedrift starting up.")
/datum/controller/process/spacedrift/statProcess()
..()
stat(null, "P:[processing_list.len]")
/datum/controller/process/spacedrift/doWork()
var/list/currentrun = processing_list.Copy()
while(currentrun.len)
var/atom/movable/AM = currentrun[currentrun.len]
currentrun.len--
if(!AM)
processing_list -= AM
SCHECK
continue
if(AM.inertia_next_move > world.time)
SCHECK
continue
if(!AM.loc || AM.loc != AM.inertia_last_loc || AM.Process_Spacemove(0))
AM.inertia_dir = 0
if(!AM.inertia_dir)
AM.inertia_last_loc = null
processing_list -= AM
SCHECK
continue
var/old_dir = AM.dir
var/old_loc = AM.loc
AM.inertia_moving = TRUE
step(AM, AM.inertia_dir)
AM.inertia_moving = FALSE
AM.inertia_next_move = world.time + AM.inertia_move_delay
if(AM.loc == old_loc)
AM.inertia_dir = 0
AM.setDir(old_dir)
AM.inertia_last_loc = AM.loc
SCHECK
DECLARE_GLOBAL_CONTROLLER(spacedrift, drift_master)

View File

@@ -0,0 +1,138 @@
#define MAX_THROWING_DIST 512 // 2 z-levels on default width
#define MAX_TICKS_TO_MAKE_UP 3 //how many missed ticks will we attempt to make up for this run.
var/global/datum/controller/process/throwing/throw_master
/datum/controller/process/throwing
var/list/processing_list
/datum/controller/process/throwing/setup()
name = "throwing"
schedule_interval = 1
start_delay = 20
log_startup_progress("Throw ticker starting up.")
/datum/controller/process/throwing/statProcess()
..()
stat(null, "P:[processing_list.len]")
/datum/controller/process/throwing/started()
..()
if(!processing_list)
processing_list = list()
/datum/controller/process/throwing/doWork()
for(last_object in processing_list)
var/atom/movable/AM = last_object
if(istype(AM) && isnull(AM.gcDestroyed))
var/datum/thrownthing/TT = processing_list[AM]
if(istype(TT) && isnull(TT.gcDestroyed))
TT.tick()
SCHECK
else
catchBadType(TT)
processing_list -= AM
AM.throwing = null
else
catchBadType(AM)
processing_list -= AM
SCHECK
DECLARE_GLOBAL_CONTROLLER(throwing, throw_master)
/datum/thrownthing
var/atom/movable/thrownthing
var/atom/target
var/turf/target_turf
var/init_dir
var/maxrange
var/speed
var/mob/thrower
var/diagonals_first
var/dist_travelled = 0
var/start_time
var/dist_x
var/dist_y
var/dx
var/dy
var/pure_diagonal
var/diagonal_error
var/datum/callback/callback
/datum/thrownthing/proc/tick()
var/atom/movable/AM = thrownthing
if(!isturf(AM.loc) || !AM.throwing)
finalize()
return
if(dist_travelled && hitcheck()) //to catch sneaky things moving on our tile while we slept
finalize()
return
var/atom/step
// calculate how many tiles to move, making up for any missed ticks.
if((dist_travelled >= maxrange || AM.loc == target_turf) && has_gravity(AM, AM.loc))
finalize()
return
if(dist_travelled <= max(dist_x, dist_y)) //if we haven't reached the target yet we home in on it, otherwise we use the initial direction
step = get_step(AM, get_dir(AM, target_turf))
else
step = get_step(AM, init_dir)
if(!pure_diagonal && !diagonals_first) // not a purely diagonal trajectory and we don't want all diagonal moves to be done first
if(diagonal_error >= 0 && max(dist_x, dist_y) - dist_travelled != 1) // we do a step forward unless we're right before the target
step = get_step(AM, dx)
diagonal_error += (diagonal_error < 0) ? dist_x / 2 : -dist_y
if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
finalize()
return
AM.Move(step, get_dir(AM, step))
if(!AM.throwing) // we hit something during our move
finalize(hit = TRUE)
return
dist_travelled++
if(dist_travelled > MAX_THROWING_DIST)
finalize()
return
/datum/thrownthing/proc/finalize(hit = FALSE)
set waitfor = 0
throw_master.processing_list -= thrownthing
// done throwning, either because it hit something or it finished moving
thrownthing.throwing = null
if(!hit)
for(var/thing in get_turf(thrownthing)) //looking for our target on the turf we land on.
var/atom/A = thing
if(A == target)
hit = 1
thrownthing.throw_impact(A, src)
break
if(!hit)
thrownthing.throw_impact(get_turf(thrownthing), src) // we haven't hit something yet and we still must, let's hit the ground.
thrownthing.newtonian_move(init_dir)
else
thrownthing.newtonian_move(init_dir)
if(callback)
callback.Invoke()
/datum/thrownthing/proc/hit_atom(atom/A)
thrownthing.throw_impact(A, src)
thrownthing.newtonian_move(init_dir)
finalize(TRUE)
/datum/thrownthing/proc/hitcheck()
for(var/thing in get_turf(thrownthing))
var/atom/movable/AM = thing
if(AM == thrownthing)
continue
if(AM.density && !(AM.pass_flags & LETPASSTHROW) && !(AM.flags & ON_BORDER))
thrownthing.throwing = null
thrownthing.throw_impact(AM, src)
return TRUE

View File

@@ -39,7 +39,6 @@
var/allow_Metadata = 0 // Metadata is supported.
var/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1.
var/Ticklag = 0.5
var/Tickcomp = 0
var/socket_talk = 0 // use socket_talk to communicate with other processes
var/list/resource_urls = null
var/antag_hud_allowed = 0 // Ghosts can turn on Antagovision to see a HUD of who is the bad guys this round.
@@ -445,9 +444,6 @@
if("socket_talk")
socket_talk = text2num(value)
if("tickcomp")
Tickcomp = 1
if("allow_antag_hud")
config.antag_hud_allowed = 1

98
code/datums/callback.dm Normal file
View File

@@ -0,0 +1,98 @@
/*
USAGE:
var/datum/callback/C = new(object|null, /proc/type/path|"procstring", arg1, arg2, ... argn)
var/timerid = addtimer(C, time, timertype)
OR
var/timerid = addtimer(CALLBACK(object|null, /proc/type/path|procstring, arg1, arg2, ... argn), time, timertype)
Note: proc strings can only be given for datum proc calls, global procs must be proc paths
Also proc strings are strongly advised against because they don't compile error if the proc stops existing
See the note on proc typepath shortcuts
INVOKING THE CALLBACK:
var/result = C.Invoke(args, to, add) //additional args are added after the ones given when the callback was created
OR
var/result = C.InvokeAsync(args, to, add) //Sleeps will not block, returns . on the first sleep (then continues on in the "background" after the sleep/block ends), otherwise operates normally.
OR
INVOKE_ASYNC(<CALLBACK args>) to immediately create and call InvokeAsync
PROC TYPEPATH SHORTCUTS (these operate on paths, not types, so to these shortcuts, datum is NOT a parent of atom, etc...)
global proc while in another global proc:
.procname
Example:
CALLBACK(GLOBAL_PROC, .some_proc_here)
proc defined on current(src) object (when in a /proc/ and not an override) OR overridden at src or any of it's parents:
.procname
Example:
CALLBACK(src, .some_proc_here)
when the above doesn't apply:
.proc/procname
Example:
CALLBACK(src, .proc/some_proc_here)
proc defined on a parent of a some type:
/some/type/.proc/some_proc_here
Other wise you will have to do the full typepath of the proc (/type/of/thing/proc/procname)
*/
/datum/callback
var/datum/object = GLOBAL_PROC
var/delegate
var/list/arguments
/datum/callback/New(thingtocall, proctocall, ...)
if(thingtocall)
object = thingtocall
delegate = proctocall
if(length(args) > 2)
arguments = args.Copy(3)
/proc/ImmediateInvokeAsync(thingtocall, proctocall, ...)
set waitfor = FALSE
if(!thingtocall)
return
var/list/calling_arguments = length(args) > 2 ? args.Copy(3) : null
if(thingtocall == GLOBAL_PROC)
call(proctocall)(arglist(calling_arguments))
else
call(thingtocall, proctocall)(arglist(calling_arguments))
/datum/callback/proc/Invoke(...)
if(!object)
return
var/list/calling_arguments = arguments
if(length(args))
if(length(arguments))
calling_arguments = calling_arguments + args //not += so that it creates a new list so the arguments list stays clean
else
calling_arguments = args
if(object == GLOBAL_PROC)
return call(delegate)(arglist(calling_arguments))
return call(object, delegate)(arglist(calling_arguments))
//copy and pasted because fuck proc overhead
/datum/callback/proc/InvokeAsync(...)
set waitfor = FALSE
if(!object)
return
var/list/calling_arguments = arguments
if(length(args))
if(length(arguments))
calling_arguments = calling_arguments + args //not += so that it creates a new list so the arguments list stays clean
else
calling_arguments = args
if(object == GLOBAL_PROC)
return call(delegate)(arglist(calling_arguments))
return call(object, delegate)(arglist(calling_arguments))

View File

@@ -9,7 +9,6 @@
var/blood_color
var/last_bumped = 0
var/pass_flags = 0
var/throwpass = 0
var/germ_level = GERM_LEVEL_AMBIENT // The higher the germ level, the more germ on the atom.
var/simulated = 1 //filter for actions - used by lighting overlays
var/atom_say_verb = "says"
@@ -236,10 +235,13 @@
/atom/proc/emag_act()
return
/atom/proc/hitby(atom/movable/AM as mob|obj)
if(density)
AM.throwing = 0
return
/atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked)
if(density && !has_gravity(AM)) //thrown stuff bounces off dense stuff in no grav, unless the thrown stuff ends up inside what it hit(embedding, bola, etc...).
addtimer(src, "hitby_react", 2, TRUE, AM)
/atom/proc/hitby_react(atom/movable/AM)
if(AM && isturf(AM.loc))
step(AM, turn(AM.dir, 180))
/atom/proc/add_hiddenprint(mob/living/M as mob)
if(isnull(M)) return

View File

@@ -6,15 +6,21 @@
// var/elevation = 2 - not used anywhere
var/move_speed = 10
var/l_move_time = 1
var/throwing = 0
var/thrower
var/turf/throw_source = null
var/throw_speed = 2
var/datum/thrownthing/throwing = null
var/throw_speed = 2 //How many tiles to move per ds when being thrown. Float values are fully supported
var/throw_range = 7
var/no_spin_thrown = 0 //set this to 1 if you don't want an item that you throw to spin, no matter what. -Fox
var/no_spin = 0
var/no_spin_thrown = 0
var/moved_recently = 0
var/mob/pulledby = null
var/inertia_dir = 0
var/atom/inertia_last_loc
var/inertia_moving = 0
var/inertia_next_move = 0
var/inertia_move_delay = 5
var/moving_diagonally = 0 //0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move
var/area/areaMaster
@@ -71,61 +77,74 @@
if(!(direct & (direct - 1))) //Cardinal move
. = ..()
else //Diagonal move, split it into cardinal moves
moving_diagonally = FIRST_DIAG_STEP
if(direct & 1)
if(direct & 4)
if(step(src, NORTH))
moving_diagonally = SECOND_DIAG_STEP
. = step(src, EAST)
else if(step(src, EAST))
moving_diagonally = SECOND_DIAG_STEP
. = step(src, NORTH)
else if(direct & 8)
if(step(src, NORTH))
moving_diagonally = SECOND_DIAG_STEP
. = step(src, WEST)
else if(step(src, WEST))
moving_diagonally = SECOND_DIAG_STEP
. = step(src, NORTH)
else if(direct & 2)
if(direct & 4)
if(step(src, SOUTH))
moving_diagonally = SECOND_DIAG_STEP
. = step(src, EAST)
else if(step(src, EAST))
moving_diagonally = SECOND_DIAG_STEP
. = step(src, SOUTH)
else if(direct & 8)
if(step(src, SOUTH))
moving_diagonally = SECOND_DIAG_STEP
. = step(src, WEST)
else if(step(src, WEST))
moving_diagonally = SECOND_DIAG_STEP
. = step(src, SOUTH)
moving_diagonally = 0
return
if(!loc || (loc == oldloc && oldloc != newloc))
last_move = 0
return
if(.)
Moved(oldloc, direct)
last_move = direct
src.move_speed = world.time - src.l_move_time
src.l_move_time = world.time
spawn(5) // Causes space drifting. /tg/station has no concept of speed, we just use 5
if(loc && direct && last_move == direct)
if(loc == newloc) //Remove this check and people can accelerate. Not opening that can of worms just yet.
newtonian_move(last_move)
if(. && buckled_mob && !handle_buckled_mob_movement(loc, direct)) //movement failed due to buckled mob
. = 0
// Called after a successful Move(). By this point, we've already moved
/atom/movable/proc/Moved(atom/OldLoc, Dir)
if(!inertia_moving)
inertia_next_move = world.time + inertia_move_delay
newtonian_move(Dir)
return 1
// Previously known as Crossed()
// Previously known as HasEntered()
// This is automatically called when something enters your square
/atom/movable/Crossed(atom/movable/AM)
return
/atom/movable/Bump(var/atom/A as mob|obj|turf|area, sendBump)
if(src.throwing)
src.throw_impact(A)
if(A && sendBump)
A.last_bumped = world.time
/atom/movable/Bump(atom/A, yes) //the "yes" arg is to differentiate our Bump proc from byond's, without it every Bump() call would become a double Bump().
if(A && yes)
if(throwing)
throwing.hit_atom(A)
. = 1
if(!A || qdeleted(A))
return
A.Bumped(src)
else
..()
/atom/movable/proc/forceMove(atom/destination)
var/turf/old_loc = loc
@@ -166,29 +185,6 @@
update_canmove() //if the mob was asleep inside a container and then got forceMoved out we need to make them fall.
//called when src is thrown into hit_atom
/atom/movable/proc/throw_impact(atom/hit_atom, var/speed)
if(istype(hit_atom,/mob/living))
var/mob/living/M = hit_atom
M.hitby(src,speed)
else if(isobj(hit_atom))
var/obj/O = hit_atom
if(!O.anchored)
step(O, src.dir)
O.hitby(src,speed)
else if(isturf(hit_atom))
src.throwing = 0
var/turf/T = hit_atom
if(T.density)
spawn(2)
step(src, turn(src.dir, 180))
if(istype(src,/mob/living))
var/mob/living/M = src
M.turf_collision(T, speed)
//Called whenever an object moves and by mobs when they attempt to move themselves through space
//And when an object or action applies a force on src, see newtonian_move() below
//Return 0 to have src start/keep drifting in a no-grav area and 1 to stop/not start drifting
@@ -201,13 +197,15 @@
if(pulledby && !pulledby.pulling)
return 1
if(throwing)
return 1
if(locate(/obj/structure/lattice) in range(1, get_turf(src))) //Not realistic but makes pushing things in space easier
return 1
return 0
/atom/movable/proc/newtonian_move(direction) //Only moves the object if it's under no gravity
if(!loc || Process_Spacemove(0))
inertia_dir = 0
return 0
@@ -216,119 +214,93 @@
if(!direction)
return 1
var/old_dir = dir
. = step(src, direction)
dir = old_dir
inertia_last_loc = loc
drift_master.processing_list[src] = src
return 1
//decided whether a movable atom being thrown can pass through the turf it is in.
/atom/movable/proc/hit_check(var/speed)
if(src.throwing)
for(var/atom/A in get_turf(src))
if(A == src) continue
if(istype(A,/mob/living))
if(A:lying) continue
src.throw_impact(A,speed)
if(isobj(A))
if(A.density && !A.throwpass) // **TODO: Better behaviour for windows which are dense, but shouldn't always stop movement
src.throw_impact(A,speed)
/atom/movable/proc/throw_at_fast(atom/target, range, speed, thrower, no_spin)
//called when src is thrown into hit_atom
/atom/movable/proc/throw_impact(atom/hit_atom, throwingdatum)
set waitfor = 0
throw_at(target, range, speed, thrower, no_spin)
return hit_atom.hitby(src)
/atom/movable/proc/throw_at(atom/target, range, speed, thrower, no_spin)
if(!target || !src || (flags & NODROP))
/atom/movable/hitby(atom/movable/AM, skipcatch, hitpush = 1, blocked)
if(!anchored && hitpush)
step(src, AM.dir)
..()
/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, var/datum/callback/callback)
if(!target || (flags & NODROP) || speed <= 0)
return 0
//use a modified version of Bresenham's algorithm to get from the atom's current position to that of the target
src.throwing = 1
src.thrower = thrower
src.throw_source = get_turf(src) //store the origin turf
if(target.allow_spin) // turns out 1000+ spinning objects being thrown at the singularity creates lag - Iamgoofball
if(!no_spin_thrown && !no_spin)
SpinAnimation(5, 1)
if(pulledby)
pulledby.stop_pulling()
// They are moving! Wouldn't it be cool if we calculated their momentum and added it to the throw?
if(thrower && thrower.last_move && thrower.client && thrower.client.move_delay >= world.time + world.tick_lag * 2)
var/user_momentum = thrower.movement_delay()
if(!user_momentum) // no movement_delay, this means they move once per byond tick, let's calculate from that instead
user_momentum = world.tick_lag
user_momentum = 1 / user_momentum // convert from ds to the tiles per ds that throw_at uses
if(get_dir(thrower, target) & last_move)
user_momentum = user_momentum // basically a noop, but needed
else if(get_dir(target, thrower) & last_move)
user_momentum = -user_momentum // we are moving away from the target, lets slowdown the throw accordingly
else
user_momentum = 0
if(user_momentum)
// first lets add that momentum to range
range *= (user_momentum / speed) + 1
//then lets add it to speed
speed += user_momentum
if(speed <= 0)
return //no throw speed, the user was moving too fast.
var/datum/thrownthing/TT = new()
TT.thrownthing = src
TT.target = target
TT.target_turf = get_turf(target)
TT.init_dir = get_dir(src, target)
TT.maxrange = range
TT.speed = speed
TT.thrower = thrower
TT.diagonals_first = diagonals_first
TT.callback = callback
var/dist_x = abs(target.x - src.x)
var/dist_y = abs(target.y - src.y)
var/dx = (target.x > src.x) ? EAST : WEST
var/dy = (target.y > src.y) ? NORTH : SOUTH
var/dx
if(target.x > src.x)
dx = EAST
else
dx = WEST
if(dist_x == dist_y)
TT.pure_diagonal = 1
var/dy
if(target.y > src.y)
dy = NORTH
else
dy = SOUTH
var/dist_travelled = 0
var/dist_since_sleep = 0
var/area/a = get_area(src.loc)
if(dist_x > dist_y)
var/error = dist_x/2 - dist_y
while(src && target &&((((src.x < target.x && dx == EAST) || (src.x > target.x && dx == WEST)) && dist_travelled < range) || (a && a.has_gravity == 0) || istype(src.loc, /turf/space)) && src.throwing && istype(src.loc, /turf))
// only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up
if(error < 0)
var/atom/step = get_step(src, dy)
if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
break
src.Move(step, get_dir(loc, step))
hit_check(speed)
error += dist_x
dist_travelled++
dist_since_sleep++
if(dist_since_sleep >= speed)
dist_since_sleep = 0
sleep(1)
else
var/atom/step = get_step(src, dx)
if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
break
src.Move(step)
hit_check(speed)
error -= dist_y
dist_travelled++
dist_since_sleep++
if(dist_since_sleep >= speed)
dist_since_sleep = 0
sleep(1)
a = get_area(src.loc)
else
var/error = dist_y/2 - dist_x
while(src && target &&((((src.y < target.y && dy == NORTH) || (src.y > target.y && dy == SOUTH)) && dist_travelled < range) || (a && a.has_gravity == 0) || istype(src.loc, /turf/space)) && src.throwing && istype(src.loc, /turf))
// only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up
if(error < 0)
var/atom/step = get_step(src, dx)
if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
break
src.Move(step)
hit_check(speed)
error += dist_y
dist_travelled++
dist_since_sleep++
if(dist_since_sleep >= speed)
dist_since_sleep = 0
sleep(1)
else
var/atom/step = get_step(src, dy)
if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
break
src.Move(step)
hit_check(speed)
error -= dist_x
dist_travelled++
dist_since_sleep++
if(dist_since_sleep >= speed)
dist_since_sleep = 0
sleep(1)
else if(dist_x <= dist_y)
var/olddist_x = dist_x
var/olddx = dx
dist_x = dist_y
dist_y = olddist_x
dx = dy
dy = olddx
TT.dist_x = dist_x
TT.dist_y = dist_y
TT.dx = dx
TT.dy = dy
TT.diagonal_error = dist_x / 2 - dist_y
TT.start_time = world.time
a = get_area(src.loc)
if(pulledby)
pulledby.stop_pulling()
//done throwing, either because it hit something or it finished moving
if(isobj(src)) src.throw_impact(get_turf(src),speed)
src.throwing = 0
src.thrower = null
src.throw_source = null
throwing = TT
if(spin && !no_spin && !no_spin_thrown)
SpinAnimation(5, 1)
throw_master.processing_list[src] = TT
TT.tick()
//Overlays

View File

@@ -1,7 +1,7 @@
/obj/item/weapon/antag_spawner
throw_speed = 1
throw_range = 5
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/used = 0
/obj/item/weapon/antag_spawner/proc/spawn_antag(var/client/C, var/turf/T, var/type = "")

View File

@@ -125,7 +125,7 @@
icon_state = "arm_blade"
item_state = "arm_blade"
flags = ABSTRACT | NODROP
w_class = 5
w_class = WEIGHT_CLASS_HUGE
sharp = 1
edge = 1
force = 25

View File

@@ -3,7 +3,7 @@
desc = "An arcane weapon wielded by the followers of a cult."
icon_state = "cultblade"
item_state = "cultblade"
w_class = 4
w_class = WEIGHT_CLASS_BULKY
force = 30
throwforce = 10
sharp = 1
@@ -38,7 +38,7 @@
desc = "A strange dagger said to be used by sinister groups for \"preparing\" a corpse before sacrificing it to their dark gods."
icon = 'icons/obj/wizard.dmi'
icon_state = "render"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
force = 15
throwforce = 25
var/cooldown = 0
@@ -123,7 +123,7 @@
icon_state = "cult_armour"
item_state = "cult_armour"
desc = "A bulky suit of armour, bristling with spikes. It looks space proof."
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank)
slowdown = 1
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
@@ -133,7 +133,7 @@
desc = "Empowered garb which creates a powerful shield around the user."
icon_state = "cult_armour"
item_state = "cult_armour"
w_class = 4
w_class = WEIGHT_CLASS_BULKY
armor = list(melee = 50, bullet = 40, laser = 50, energy = 30, bomb = 50, bio = 30, rad = 30)
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)

View File

@@ -261,7 +261,7 @@ var/list/blacklisted_pylon_turfs = typecacheof(list(
/obj/item/weapon/storage/box/cult
name = "Dark Forge Cache"
can_hold = list("/obj/item/clothing/suit/space/cult", "/obj/item/clothing/head/helmet/space/cult")
max_w_class = 3
max_w_class = WEIGHT_CLASS_NORMAL
/obj/item/weapon/storage/box/cult/New()
..()

View File

@@ -24,7 +24,7 @@
icon_state ="tome"
throw_speed = 2
throw_range = 5
w_class = 2
w_class = WEIGHT_CLASS_SMALL
var/scribereduct = 0
var/canbypass = 0 //ADMINBUS

View File

@@ -588,6 +588,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
icon = 'icons/obj/abductor.dmi'
icon_state = "bed"
no_icon_updates = 1 //no icon updates for this; it's static.
injected_reagents = list("corazone")
/obj/structure/closet/abductor
name = "alien locker"
@@ -595,4 +596,4 @@ Congratulations! You are now trained for invasive xenobiology research!"}
icon_state = "abductor"
icon_closed = "abductor"
icon_opened = "abductoropen"
material_drop = /obj/item/stack/sheet/mineral/abductor
material_drop = /obj/item/stack/sheet/mineral/abductor

View File

@@ -317,7 +317,7 @@
desc = "A pile of fine blue dust. Small tendrils of violet mist swirl around it."
icon = 'icons/effects/effects.dmi'
icon_state = "revenantEctoplasm"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
var/reforming = 1
var/essence = 75 //the maximum essence of the reforming revenant
var/inert = 0

View File

@@ -4,7 +4,7 @@
icon_state = "pinoff"
flags = CONDUCT
slot_flags = SLOT_PDA | SLOT_BELT
w_class = 2
w_class = WEIGHT_CLASS_SMALL
item_state = "electronic"
throw_speed = 4
throw_range = 20

View File

@@ -7,7 +7,7 @@
icon_state ="scroll2"
throw_speed = 1
throw_range = 5
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/used = 0
@@ -119,7 +119,7 @@
item_state = "render"
force = 15
throwforce = 10
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
hitsound = 'sound/weapons/bladeslice.ogg'
var/charged = 1
var/spawn_type = /obj/singularity/narsie/wizard
@@ -232,7 +232,7 @@ var/global/list/multiverse = list()
throwforce = 10
sharp = 1
edge = 1
w_class = 2
w_class = WEIGHT_CLASS_SMALL
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
var/faction = list("unassigned")
var/cooldown = 0
@@ -616,7 +616,7 @@ var/global/list/multiverse = list()
icon_state = "necrostone"
item_state = "electronic"
origin_tech = "bluespace=4;materials=4"
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/list/spooky_scaries = list()
var/unlimited = 0
var/heresy = 0
@@ -753,7 +753,7 @@ var/global/list/multiverse = list()
icon_state = "nyacrostone"
item_state = "electronic"
origin_tech = "bluespace=4;materials=4"
w_class = 1
w_class = WEIGHT_CLASS_TINY
heresy = 1
unlimited = 1
@@ -793,7 +793,7 @@ var/global/list/multiverse = list()
return
if(!link)
if(I.loc == user && istype(I) && I.w_class <= 2)
if(I.loc == user && istype(I) && I.w_class <= WEIGHT_CLASS_SMALL)
user.drop_item()
I.loc = src
link = I

View File

@@ -8,7 +8,7 @@
icon_state = "syndballoon"
item_state = null
flags = ABSTRACT | NODROP
w_class = 5
w_class = WEIGHT_CLASS_HUGE
force = 0
throwforce = 0
throw_range = 0

View File

@@ -4,7 +4,7 @@
icon_state = "soulstone"
item_state = "electronic"
desc = "A fragment of the legendary treasure known simply as the 'Soul Stone'. The shard still flickers with a fraction of the full artifact's power."
w_class = 1
w_class = WEIGHT_CLASS_TINY
slot_flags = SLOT_BELT
origin_tech = "bluespace=4;materials=4"
var/imprinted = "empty"
@@ -347,4 +347,4 @@
T.unEquip(W)
init_shade(T, U)
qdel(T)
return 1
return 1

View File

@@ -497,7 +497,7 @@
icon_state ="book"
throw_speed = 2
throw_range = 5
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/uses = 10
var/temp = null
var/op = 1
@@ -863,4 +863,4 @@
spell = /obj/effect/proc_holder/spell/targeted/sacred_flame
spellname = "sacred flame"
icon_state ="booksacredflame"
desc = "Become one with the flames that burn within... and invite others to do so as well."
desc = "Become one with the flames that burn within... and invite others to do so as well."

View File

@@ -14,6 +14,7 @@
var/obj/machinery/computer/operating/computer = null
buckle_lying = 90
var/no_icon_updates = 0 //set this to 1 if you don't want the icons ever changing
var/list/injected_reagents = list()
/obj/machinery/optable/New()
..()
@@ -97,8 +98,18 @@
icon_state = "table2-idle"
return 0
/obj/machinery/optable/Crossed(atom/movable/AM)
. = ..()
if(iscarbon(AM) && LAZYLEN(injected_reagents))
to_chat(AM, "<span class='danger'>You feel a series of tiny pricks!</span>")
/obj/machinery/optable/process()
check_victim()
if(LAZYLEN(injected_reagents))
for(var/mob/living/carbon/C in get_turf(src))
for(var/chemical in injected_reagents)
if(C.reagents.get_reagent_amount(chemical) < 1)
C.reagents.add_reagent(chemical, 1)
/obj/machinery/optable/proc/take_victim(mob/living/carbon/C, mob/living/carbon/user as mob)
if(C == user)

View File

@@ -1070,7 +1070,7 @@ Just an object used in constructing air alarms
icon = 'icons/obj/doors/door_assembly.dmi'
icon_state = "door_electronics"
desc = "Looks like a circuit. Probably is."
w_class = 2
w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=50, MAT_GLASS=50)
toolspeed = 1
usesound = 'sound/items/Deconstruct.ogg'

View File

@@ -3,7 +3,7 @@
desc = "A pre-fabricated security camera kit, ready to be assembled and mounted to a surface."
icon = 'icons/obj/monitors.dmi'
icon_state = "cameracase"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
anchored = 0
materials = list(MAT_METAL=400, MAT_GLASS=250)

View File

@@ -5,6 +5,9 @@
#define CLONE_BIOMASS 150
#define BIOMASS_MEAT_AMOUNT 50
#define MINIMUM_HEAL_LEVEL 40
#define CLONE_INITIAL_DAMAGE 190
#define BRAIN_INITIAL_DAMAGE 90 // our minds are too feeble for 190
/obj/machinery/clonepod
anchored = 1
@@ -15,12 +18,10 @@
icon_state = "pod_0"
req_access = list(access_genetics) //For premature unlocking.
var/mob/living/carbon/human/occupant
var/heal_level = 90 //The clone is released once its health reaches this level.
var/locked = 0
var/heal_level //The clone is released once its health reaches this level.
var/obj/machinery/computer/cloning/connected = null //So we remember the connected clone machine.
var/mess = 0 //Need to clean out it if it's full of exploded clone.
var/attempting = 0 //One clone attempt at a time thanks
var/eject_wait = 0 //Don't eject them as soon as they are created fuckkk
var/biomass = 0
var/speed_coeff
var/efficiency
@@ -33,6 +34,10 @@
var/obj/effect/countdown/clonepod/countdown
var/list/brine_types = list("corazone", "salbutamol", "hydrocodone")
var/list/missing_organs
var/organs_number = 0
light_color = LIGHT_COLOR_PURE_GREEN
/obj/machinery/clonepod/power_change()
@@ -84,6 +89,7 @@
connected.pods -= src
QDEL_NULL(Radio)
QDEL_NULL(countdown)
QDEL_LIST(missing_organs)
return ..()
/obj/machinery/clonepod/RefreshParts()
@@ -93,7 +99,7 @@
efficiency += S.rating
for(var/obj/item/weapon/stock_parts/manipulator/P in component_parts)
speed_coeff += P.rating
heal_level = min((efficiency * 15) + 10, 100)
heal_level = max(min((efficiency * 15) + 10, 100), MINIMUM_HEAL_LEVEL)
//The return of data disks?? Just for transferring between genetics machine/cloning machine.
//TO-DO: Make the genetics machine accept them.
@@ -217,19 +223,21 @@
if(!G)
return 0
/*
if(clonemind.damnation_type) //Can't clone the damned.
playsound('sound/hallucinations/veryfar_noise.ogg', 50, 0)
malfunction()
return -1 // so that the record gets flushed out
*/
if(biomass >= CLONE_BIOMASS)
biomass -= CLONE_BIOMASS
else
return 0
attempting = 1 //One at a time!!
locked = 1
countdown.start()
eject_wait = 1
spawn(30)
eject_wait = 0
if(!R.dna)
R.dna = new /datum/dna()
@@ -246,9 +254,24 @@
for(var/datum/language/L in R.languages)
H.add_language(L.name)
domutcheck(H, null, MUTCHK_FORCED) //Ensures species that get powers by the species proc handle_dna keep them
if(efficiency > 2 && efficiency < 5 && prob(25))
randmutb(H)
if(efficiency > 5 && prob(20))
randmutg(H)
if(efficiency < 3 && prob(50))
randmutb(H)
H.dna.UpdateSE()
H.dna.UpdateUI()
H.sync_organ_dna(1) // It's literally a fresh body as you can get, so all organs properly belong to it
H.UpdateAppearance()
check_brine()
//Get the clone body ready
H.adjustCloneLoss(190) //new damage var so you can't eject a clone early then stab them to abuse the current damage system --NeoFite
H.adjustBrainLoss(90) // The rand(10, 30) will come out as extra brain damage
maim_clone(H)
H.Paralyse(4)
//Here let's calculate their health so the pod doesn't immediately eject them!!!
@@ -266,21 +289,6 @@
beginning to regenerate in a cloning pod. You will
become conscious when it is complete.</span>"})
domutcheck(H, null, MUTCHK_FORCED) //Ensures species that get powers by the species proc handle_dna keep them
if(efficiency > 2 && efficiency < 5 && prob(25))
randmutb(H)
if(efficiency > 5 && prob(20))
randmutg(H)
if(efficiency < 3 && prob(50))
randmutb(H)
H.dna.UpdateSE()
H.dna.UpdateUI()
H.sync_organ_dna(1) // It's literally a fresh body as you can get, so all organs properly belong to it
H.UpdateAppearance()
update_icon()
H.suiciding = 0
@@ -299,13 +307,11 @@
if(stat & NOPOWER) //Autoeject if power is lost
if(occupant)
locked = 0
go_out()
connected_message("Clone Ejected: Loss of power.")
else if((occupant) && (occupant.loc == src))
if((occupant.stat == DEAD) || (occupant.suiciding)) //Autoeject corpses and suiciding dudes.
locked = 0
announce_radio_message("The cloning of <b>[occupant]</b> has been aborted due to unrecoverable tissue failure.")
go_out()
connected_message("Clone Rejected: Deceased.")
@@ -316,34 +322,43 @@
//Slowly get that clone healed and finished.
occupant.adjustCloneLoss(-((speed_coeff/2)))
// For human species that lack non-vital parts for some weird reason
if(organs_number)
var/progress = CLONE_INITIAL_DAMAGE - occupant.getCloneLoss()
progress += (100 - MINIMUM_HEAL_LEVEL)
var/milestone = CLONE_INITIAL_DAMAGE / organs_number
// Doing this as a #define so that the value can change when evaluated multiple times
#define INSTALLED (organs_number - LAZYLEN(missing_organs))
while((progress / milestone) > INSTALLED && LAZYLEN(missing_organs))
var/obj/item/organ/I = pick_n_take(missing_organs)
I.replaced(occupant)
#undef INSTALLED
//Premature clones may have brain damage.
occupant.adjustBrainLoss(-((speed_coeff/20)*efficiency))
//So clones don't die of oxyloss in a running pod.
if(occupant.reagents.get_reagent_amount("salbutamol") < 5)
occupant.reagents.add_reagent("salbutamol", 5)
check_brine()
//Also heal some oxyloss ourselves just in case!!
occupant.adjustOxyLoss(-4)
use_power(7500) //This might need tweaking.
else if((occupant.cloneloss <= (100 - heal_level)) && (!eject_wait))
else if((occupant.cloneloss <= (100 - heal_level)))
connected_message("Cloning Process Complete.")
announce_radio_message("The cloning cycle of <b>[occupant]</b> is complete.")
locked = 0
go_out()
else if((!occupant) || (occupant.loc != src))
occupant = null
if(locked)
locked = 0
update_icon()
use_power(200)
//Let's unlock this early I guess. Might be too early, needs tweaking.
/obj/machinery/clonepod/attackby(obj/item/weapon/W, mob/user, params)
if(!(occupant || mess || locked))
if(!(occupant || mess))
if(default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]", W))
return
@@ -357,14 +372,14 @@
if(!check_access(W))
to_chat(user, "<span class='danger'>Access Denied.</span>")
return
if (!locked || !occupant)
return
if(occupant.health < -20 && occupant.stat != DEAD)
to_chat(user, "<span class='danger'>Access Refused. Patient status still unstable.</span>")
if(!(occupant || mess))
to_chat(user, "<span class='danger'>Error: Pod has no occupant.</span>")
return
else
locked = 0
to_chat(user, "System unlocked.")
connected_message("Authorized Ejection")
announce_radio_message("An authorized ejection of [occupant.real_name] has occured")
to_chat(user, "<span class='notice'>You force an emergency ejection.</span>")
go_out()
//Removing cloning pod biomass
else if(istype(W, /obj/item/weapon/reagent_containers/food/snacks/meat))
@@ -374,7 +389,7 @@
qdel(W)
return
else if(istype(W, /obj/item/weapon/wrench))
if(locked && (anchored || occupant))
if(occupant)
to_chat(user, "<span class='warning'>Can not do that while [src] is in use.</span>")
else
if(anchored)
@@ -399,8 +414,6 @@
/obj/machinery/clonepod/emag_act(user)
if(isnull(occupant))
return
to_chat(user, "You force an emergency ejection.")
locked = 0
go_out()
/obj/machinery/clonepod/proc/update_clone_antag(var/mob/living/carbon/human/H)
@@ -435,21 +448,7 @@
connected.updateUsrDialog()
return 1
/obj/machinery/clonepod/verb/eject()
set name = "Eject Cloner"
set category = "Object"
set src in oview(1)
if(!usr)
return
if(usr.incapacitated())
return
go_out()
add_fingerprint(usr)
/obj/machinery/clonepod/proc/go_out()
if(locked)
return
countdown.stop()
if(mess) //Clean that mess and dump those gibs!
@@ -470,8 +469,11 @@
<i>You feel like a new being.</i></span>")
occupant.flash_eyes(visual = 1)
for(var/i in missing_organs)
qdel(i)
missing_organs.Cut()
occupant.forceMove(get_turf(src))
eject_wait = 0 //If it's still set somehow.
occupant.update_body()
domutcheck(occupant) //Waiting until they're out before possible notransform.
occupant.shock_stage = 0 //Reset Shock
occupant = null
@@ -481,19 +483,24 @@
if(occupant)
connected_message("Critical Error!")
announce_radio_message("Critical error! Please contact a Thinktronic Systems technician, as your warranty may be affected.")
mess = 1
update_icon()
if(occupant.mind != clonemind)
clonemind.transfer_to(occupant)
occupant.grab_ghost() // We really just want to make you suffer.
to_chat(occupant, {"<span class='warning'><b>Agony blazes across your
consciousness as your body is torn apart.</b><br>
<i>Is this what dying is like? Yes it is.</i></span>"})
playsound(loc, 'sound/machines/warning-buzzer.ogg', 50, 0)
occupant << sound('sound/hallucinations/veryfar_noise.ogg',0,1,50)
for(var/i in missing_organs)
qdel(i)
missing_organs.Cut()
spawn(40)
qdel(occupant)
playsound(loc, 'sound/machines/warning-buzzer.ogg', 50, 0)
mess = TRUE
update_icon()
/obj/machinery/clonepod/update_icon()
..()
icon_state = "pod_0"
@@ -535,6 +542,43 @@
else
return
/obj/machinery/clonepod/proc/maim_clone(mob/living/carbon/human/H)
LAZYINITLIST(missing_organs)
for(var/i in missing_organs)
qdel(i)
missing_organs.Cut()
H.setCloneLoss(CLONE_INITIAL_DAMAGE)
H.setBrainLoss(BRAIN_INITIAL_DAMAGE)
for(var/o in H.internal_organs)
var/obj/item/organ/O = o
if(!istype(O) || O.vital)
continue
// Let's non-specially remove all non-vital organs
// What could possibly go wrong
var/obj/item/I = O.remove(H)
// Make this support stuff that turns into items when removed
I.forceMove(src)
missing_organs += I
var/static/list/zones = list("r_arm", "l_arm", "r_leg", "l_leg")
for(var/zone in zones)
var/obj/item/organ/external/E = H.get_organ(zone)
var/obj/item/I = E.remove(H)
I.forceMove(src)
missing_organs += I
organs_number = LAZYLEN(missing_organs)
/obj/machinery/clonepod/proc/check_brine()
// Clones are in a pickled bath of mild chemicals, keeping
// them alive, despite their lack of internal organs
for(var/bt in brine_types)
if(occupant.reagents.get_reagent_amount(bt) < 1)
occupant.reagents.add_reagent(bt, 1)
/*
* Diskette Box
*/
@@ -586,3 +630,5 @@
if(istype(A, /obj/machinery/clonepod))
A:malfunction()
*/
#undef MINIMUM_HEAL_LEVEL

View File

@@ -423,7 +423,7 @@
hitsound = 'sound/weapons/bladeslice.ogg'
force = 40
throwforce = 10
w_class = 4
w_class = WEIGHT_CLASS_BULKY
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
block_chance = 50
@@ -442,7 +442,7 @@
throw_speed = 1
throw_range = 5
throwforce = 0
w_class = 2
w_class = WEIGHT_CLASS_SMALL
armour_penetration = 50
block_chance = 50
var/active = 0
@@ -466,13 +466,13 @@
if(active)
force = 30
icon_state = "sword[item_color]"
w_class = 4
w_class = WEIGHT_CLASS_BULKY
playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
to_chat(user, "<span class='notice'>[src] is now active.</span>")
else
force = 3
icon_state = "sword0"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
to_chat(user, "<span class='notice'>[src] can now be concealed.</span>")
if(istype(user,/mob/living/carbon/human))
@@ -489,7 +489,7 @@
name = "basketball"
item_state = "basketball"
desc = "Here's your chance, do your dance at the Space Jam."
w_class = 4 //Stops people from hiding it in their bags/pockets
w_class = WEIGHT_CLASS_BULKY //Stops people from hiding it in their bags/pockets
/obj/structure/holohoop
name = "basketball hoop"
@@ -498,7 +498,7 @@
icon_state = "hoop"
anchored = 1
density = 1
throwpass = 1
pass_flags = LETPASSTHROW
/obj/structure/holohoop/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)

View File

@@ -991,7 +991,7 @@
desc = "A model spaceship, it looks like those used back in the day when travelling to Orion! It even has a miniature FX-293 reactor, which was renowned for its instability and tendency to explode..."
icon = 'icons/obj/toy.dmi'
icon_state = "ship"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
var/active = 0 //if the ship is on
/obj/item/weapon/orion_ship/examine(mob/user)

View File

@@ -13,7 +13,7 @@
/obj/item/weapon/circuitboard
density = 0
anchored = 0
w_class = 2
w_class = WEIGHT_CLASS_SMALL
name = "circuit board"
icon = 'icons/obj/module.dmi'
icon_state = "id_mod"

View File

@@ -310,6 +310,7 @@
temp = "<span class=\"bad\">Error: No cloning pod detected.</span>"
else
var/obj/machinery/clonepod/pod = selected_pod
var/cloneresult
if(!selected_pod)
temp = "<span class=\"bad\">Error: No cloning pod selected.</span>"
else if(pod.occupant)
@@ -320,13 +321,16 @@
temp = "<span class=\"bad\">Error: The cloning pod is malfunctioning.</span>"
else if(!config.revival_cloning)
temp = "<span class=\"bad\">Error: Unable to initiate cloning cycle.</span>"
else if(pod.growclone(C))
temp = "Initiating cloning cycle..."
records.Remove(C)
qdel(C)
menu = 1
else
temp = "[C.name] => <font class='bad'>Initialisation failure.</font>"
cloneresult = pod.growclone(C)
if(cloneresult)
if(cloneresult > 0)
temp = "Initiating cloning cycle..."
records.Remove(C)
qdel(C)
menu = 1
else
temp = "[C.name] => <font class='bad'>Initialisation failure.</font>"
else
temp = "<span class=\"bad\">Error: Data corruption.</span>"

View File

@@ -4,7 +4,7 @@
name = "airlock electronics"
icon = 'icons/obj/doors/door_assembly.dmi'
icon_state = "door_electronics"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=50, MAT_GLASS=50)
req_access = list(access_engine)
@@ -64,10 +64,10 @@
/obj/item/weapon/airlock_electronics/Topic(href, href_list)
..()
if(usr.incapacitated() || (!ishuman(usr) && !isrobot(usr)))
return 1
if(href_list["close"])
usr << browse(null, "window=airlock")
return
@@ -106,4 +106,3 @@
conf_access -= req
if(!conf_access.len)
conf_access = null

View File

@@ -259,7 +259,7 @@
icon = 'icons/obj/doors/door_assembly.dmi'
icon_state = "door_electronics"
desc = "A circuit board used in construction of firelocks."
w_class = 2
w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=50, MAT_GLASS=50)
toolspeed = 1
usesound = 'sound/items/Deconstruct.ogg'

View File

@@ -167,18 +167,16 @@
..()
//When an object is thrown at the window
/obj/machinery/door/window/hitby(AM as mob|obj)
/obj/machinery/door/window/hitby(atom/movable/AM)
..()
var/tforce = 0
if(ismob(AM))
tforce = 40
else
tforce = AM:throwforce
else if(isobj(AM))
var/obj/O = AM
tforce = O.throwforce
playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1)
take_damage(tforce)
//..() //Does this really need to be here twice? The parent proc doesn't even do anything yet. - Nodrak
return
/obj/machinery/door/window/mech_melee_attack(obj/mecha/M)
if(M.damtype == "brute")

View File

@@ -74,7 +74,7 @@
throw_speed = 4
throw_range = 7
force = 0
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/dye_color = "#FFFFFF"
/obj/item/hair_dye_bottle/New()

View File

@@ -267,7 +267,7 @@ Just a object used in constructing fire alarms
icon = 'icons/obj/doors/door_assembly.dmi'
icon_state = "door_electronics"
desc = "A circuit. It has a label on it, it says \"Can handle heat levels up to 40 degrees celsius!\""
w_class = 2
w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=50, MAT_GLASS=50)
toolspeed = 1
usesound = 'sound/items/Deconstruct.ogg'

View File

@@ -607,7 +607,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
desc = "An issue of The Griffon, the newspaper circulating aboard Nanotrasen Space Stations."
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "newspaper"
w_class = 2 //Let's make it fit in trashbags!
w_class = WEIGHT_CLASS_SMALL //Let's make it fit in trashbags!
attack_verb = list("bapped")
var/screen = 0
var/pages = 0

View File

@@ -49,7 +49,7 @@
icon = 'icons/obj/pipe-item.dmi'
icon_state = "simple"
item_state = "buildpipe"
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
level = 2
var/flipped = 0
@@ -635,7 +635,7 @@
icon = 'icons/obj/pipe-item.dmi'
icon_state = "meter"
item_state = "buildpipe"
w_class = 4
w_class = WEIGHT_CLASS_BULKY
/obj/item/pipe_meter/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params)
..()
@@ -656,7 +656,7 @@
icon = 'icons/obj/stationobjs.dmi'
icon_state = "gsensor0"
item_state = "buildpipe"
w_class = 4
w_class = WEIGHT_CLASS_BULKY
/obj/item/pipe_gsensor/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
..()

View File

@@ -94,51 +94,49 @@
/obj/machinery/shield/hitby(AM as mob|obj)
//Super realistic, resource-intensive, real-time damage calculations.
..()
var/tforce = 0
if(ismob(AM))
tforce = 40
else
tforce = AM:throwforce
else if(isobj(AM))
var/obj/O = AM
tforce = O.throwforce
src.health -= tforce
health -= tforce
//This seemed to be the best sound for hitting a force field.
playsound(src.loc, 'sound/effects/EMPulse.ogg', 100, 1)
playsound(loc, 'sound/effects/EMPulse.ogg', 100, 1)
//Handle the destruction of the shield
if(src.health <= 0)
if(health <= 0)
visible_message("<span class='notice'>The [src] dissipates</span>")
qdel(src)
return
//The shield becomes dense to absorb the blow.. purely asthetic.
opacity = 1
spawn(20) if(src) opacity = 0
..()
return
spawn(20)
if(src)
opacity = 0
/obj/machinery/shieldgen
name = "Emergency shield projector"
desc = "Used to seal minor hull breaches."
icon = 'icons/obj/objects.dmi'
icon_state = "shieldoff"
density = 1
opacity = 0
anchored = 0
pressure_resistance = 2*ONE_ATMOSPHERE
req_access = list(access_engine)
var/const/max_health = 100
var/health = max_health
var/active = 0
var/malfunction = 0 //Malfunction causes parts of the shield to slowly dissapate
var/list/deployed_shields = list()
var/is_open = 0 //Whether or not the wires are exposed
var/locked = 0
name = "Emergency shield projector"
desc = "Used to seal minor hull breaches."
icon = 'icons/obj/objects.dmi'
icon_state = "shieldoff"
density = 1
opacity = 0
anchored = 0
pressure_resistance = 2*ONE_ATMOSPHERE
req_access = list(access_engine)
var/const/max_health = 100
var/health = max_health
var/active = 0
var/malfunction = 0 //Malfunction causes parts of the shield to slowly dissapate
var/list/deployed_shields = list()
var/is_open = 0 //Whether or not the wires are exposed
var/locked = 0
/obj/machinery/shieldgen/Destroy()
QDEL_LIST(deployed_shields)

View File

@@ -192,7 +192,7 @@
icon = 'icons/obj/assemblies.dmi'
icon_state = "bombcore"
item_state = "eshield0"
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
origin_tech = "syndicate=6;combat=5"
burn_state = FLAMMABLE //Burnable (but the casing isn't)
var/adminlog = null
@@ -296,7 +296,7 @@
/obj/item/weapon/bombcore/miniature
name = "small bomb core"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
/obj/item/weapon/bombcore/miniature/detonate()
explosion(src.loc,1,2,4,flame_range = 2) //Identical to a minibomb
@@ -310,7 +310,7 @@
icon = 'icons/obj/assemblies.dmi'
icon_state = "bigred"
item_state = "electronic"
w_class = 1
w_class = WEIGHT_CLASS_TINY
origin_tech = "syndicate=2"
var/cooldown = 0
var/detonated = 0
@@ -335,4 +335,4 @@
detonated = 0
existant = 0
cooldown = 1
spawn(30) cooldown = 0
spawn(30) cooldown = 0

View File

@@ -546,12 +546,10 @@
to_chat(user, "<span class='notice'>You successfully pull the coin out before the [src] could swallow it.</span>")
else
to_chat(user, "<span class='notice'>You weren't able to pull the coin out fast enough, the machine ate it, string and all.</span>")
coin = null
qdel(coin)
QDEL_NULL(coin)
categories &= ~CAT_COIN
else
coin = null
qdel(coin)
QDEL_NULL(coin)
categories &= ~CAT_COIN
R.amount--

View File

@@ -368,9 +368,12 @@
breakthrough = 1
else
throwing = 0 //so mechas don't get stuck when landing after being sent by a Mass Driver
if(throwing)
throwing.finalize(FALSE)
crashing = null
..()
if(breakthrough)
if(crashing)
spawn(1)
@@ -524,7 +527,7 @@
user.create_attack_log("<font color='red'>attacked [name]</font>")
return
/obj/mecha/hitby(atom/movable/A as mob|obj) //wrapper
/obj/mecha/hitby(atom/movable/A) //wrapper
..()
log_message("Hit by [A].",1)
@@ -537,6 +540,7 @@
dam_coeff = B.damage_coeff
counter_tracking = 1
break
if(istype(A, /obj/item/mecha_parts/mecha_tracking))
if(!counter_tracking)
A.forceMove(src)

View File

@@ -71,7 +71,7 @@
desc = "Device used to transmit exosuit data."
icon = 'icons/obj/device.dmi'
icon_state = "motion2"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
origin_tech = "programming=2;magnets=2"
var/ai_beacon = FALSE //If this beacon allows for AI control. Exists to avoid using istype() on checking.

View File

@@ -6,7 +6,7 @@
name = "mecha part"
icon = 'icons/mecha/mech_construct.dmi'
icon_state = "blank"
w_class = 6
w_class = WEIGHT_CLASS_GIGANTIC
flags = CONDUCT
origin_tech = "programming=2;materials=2"
@@ -379,7 +379,7 @@
board_type = "other"
flags = CONDUCT
force = 5.0
w_class = 2
w_class = WEIGHT_CLASS_SMALL
throwforce = 5.0
throw_speed = 3
throw_range = 15
@@ -487,5 +487,3 @@
/obj/item/weapon/circuitboard/mecha/pod
name = "Circuit board (Space Pod Mainboard)"
icon_state = "mainboard"

View File

@@ -104,9 +104,9 @@
/obj/structure/alien/resin/hitby(atom/movable/AM)
..()
var/tforce = 0
if(!isobj(AM))
if(ismob(AM))
tforce = 10
else
else if(isobj(AM))
var/obj/O = AM
tforce = O.throwforce
playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)

View File

@@ -67,7 +67,7 @@
/obj/item/clothing/gloves/color/black = 20,
/obj/item/clothing/head/hardhat = 10,
/obj/item/clothing/head/hardhat/red = 10,
/obj/item/clothing/head/that{throwforce = 1; throwing = 1} = 10,
/obj/item/clothing/head/that = 10,
/obj/item/clothing/head/ushanka = 10,
/obj/item/clothing/head/welding = 10,
/obj/item/clothing/mask/gas = 10,

View File

@@ -20,7 +20,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
var/health = null
var/hitsound = null
var/usesound = null
var/w_class = 3
var/w_class = WEIGHT_CLASS_NORMAL
var/slot_flags = 0 //This is used to determine on which slots an item can fit.
pass_flags = PASSTABLE
pressure_resistance = 3
@@ -61,6 +61,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
var/block_chance = 0
var/hit_reaction_chance = 0 //If you want to have something unrelated to blocking/armour piercing etc. Maybe not needed, but trying to think ahead/allow more freedom
var/mob/thrownby = null
var/toolspeed = 1 // If this item is a tool, the speed multiplier
/* Species-specific sprites, concept stolen from Paradise//vg/.
@@ -144,16 +146,18 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
/obj/item/examine(mob/user, var/distance = -1)
var/size
switch(src.w_class)
if(1.0)
if(WEIGHT_CLASS_TINY)
size = "tiny"
if(2.0)
if(WEIGHT_CLASS_SMALL)
size = "small"
if(3.0)
if(WEIGHT_CLASS_NORMAL)
size = "normal-sized"
if(4.0)
if(WEIGHT_CLASS_BULKY)
size = "bulky"
if(5.0)
if(WEIGHT_CLASS_HUGE)
size = "huge"
if(WEIGHT_CLASS_GIGANTIC)
size = "gigantic"
. = ..(user, distance, "", "It is a [size] item.")
@@ -217,7 +221,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
var/obj/item/weapon/storage/S = src.loc
S.remove_from_storage(src)
src.throwing = 0
if(throwing)
throwing.finalize(FALSE)
if(loc == user)
if(!user.unEquip(src))
return 0
@@ -231,36 +236,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
user.put_in_active_hand(src)
return 1
/obj/item/attack_alien(mob/user as mob)
if(isalien(user)) // -- TLE
var/mob/living/carbon/alien/A = user
if(!A.has_fine_manipulation)
if(src in A.contents) // To stop Aliens having items stuck in their pockets
A.unEquip(src)
to_chat(user, "Your claws aren't capable of such fine manipulation.")
return
if(istype(src.loc, /obj/item/weapon/storage))
for(var/mob/M in range(1, src.loc))
if(M.s_active == src.loc)
if(M.client)
M.client.screen -= src
src.throwing = 0
if(src.loc == user)
if(!user.unEquip(src))
return
else
if(istype(src.loc, /mob/living))
return
src.pickup(user)
user.put_in_active_hand(src)
return
/obj/item/attack_alien(mob/user as mob)
var/mob/living/carbon/alien/A = user
@@ -323,9 +298,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
/obj/item/proc/talk_into(mob/M, var/text, var/channel=null)
return
/obj/item/proc/moved(mob/user, old_loc)
return
/obj/item/proc/dropped(mob/user)
for(var/X in actions)
var/datum/action/A = X
@@ -546,6 +518,23 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
throw_at(S,14,3)
else ..()
/obj/item/throw_impact(atom/A)
if(A && !qdeleted(A))
var/itempush = 1
if(w_class < WEIGHT_CLASS_BULKY)
itempush = 0 // too light to push anything
return A.hitby(src, 0, itempush)
/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback)
thrownby = thrower
callback = CALLBACK(src, .proc/after_throw, callback) //replace their callback with our own
. = ..(target, range, speed, thrower, spin, diagonals_first, callback)
/obj/item/proc/after_throw(datum/callback/callback)
if(callback) //call the original callback
. = callback.Invoke()
throw_speed = initial(throw_speed) //explosions change this.
/obj/item/proc/pwr_drain()
return 0 // Process Kill

View File

@@ -51,7 +51,7 @@
desc = "This is a one-use permit that allows the user to officially declare a built room as new addition to the station."
fluffnotice = "Nanotrasen Engineering requires all on-station construction projects to be approved by a head of staff, as detailed in Nanotrasen Company Regulation 512-C (Mid-Shift Modifications to Company Property). \
By submitting this form, you accept any fines, fees, or personal injury/death that may occur during construction."
w_class = 1
w_class = WEIGHT_CLASS_TINY
/obj/item/areaeditor/permit/attack_self(mob/user)
. = ..()
@@ -76,7 +76,7 @@
icon = 'icons/obj/items.dmi'
icon_state = "blueprints"
fluffnotice = "Property of Nanotrasen. For heads of staff only. Store in high-secure storage."
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
var/list/showing = list()
var/client/viewing

View File

@@ -5,7 +5,7 @@
desc = "A folded bag designed for the storage and transportation of cadavers."
icon = 'icons/obj/bodybag.dmi'
icon_state = "bodybag_folded"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
attack_self(mob/user)
var/obj/structure/closet/body_bag/R = new /obj/structure/closet/body_bag(user.loc)
@@ -136,4 +136,4 @@
to_chat(user, "The controls are now [src.locked ? "locked." : "unlocked."]")
else
to_chat(user, "<span class='warning'>Access denied.</span>")
return
return

View File

@@ -4,7 +4,7 @@
icon = 'icons/obj/candle.dmi'
icon_state = "candle1"
item_state = "candle1"
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/wax = 200
var/lit = 0
var/infinite = 0
@@ -91,4 +91,4 @@
/obj/item/candle/eternal
desc = "A candle. This one seems to have an odd quality about the wax."
infinite = 1
infinite = 1

View File

@@ -8,7 +8,7 @@
icon = 'icons/obj/device.dmi'
name = "control wand"
desc = "Remotely controls airlocks."
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/mode = WAND_OPEN
var/region_access = 1 //See access.dm
var/obj/item/weapon/card/id/ID

View File

@@ -7,7 +7,7 @@
desc = "A colourful crayon. Looks tasty. Mmmm..."
icon = 'icons/obj/crayons.dmi'
icon_state = "crayonred"
w_class = 1
w_class = WEIGHT_CLASS_TINY
slot_flags = SLOT_BELT | SLOT_EARS
attack_verb = list("attacked", "coloured")
toolspeed = 1

View File

@@ -3,7 +3,7 @@
icon = 'icons/obj/aicards.dmi'
icon_state = "aicard" // aicard-full
item_state = "electronic"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
flags = NOBLUDGEON
var/flush = null

View File

@@ -9,7 +9,7 @@
desc = "For illicit snooping through the camera network."
icon = 'icons/obj/device.dmi'
icon_state = "camera_bug"
w_class = 1.0
w_class = WEIGHT_CLASS_TINY
item_state = "camera_bug"
throw_speed = 4
throw_range = 20

View File

@@ -7,7 +7,7 @@
throwforce = 5.0
throw_speed = 3
throw_range = 5
w_class = 2
w_class = WEIGHT_CLASS_SMALL
origin_tech = "syndicate=4;magnets=4"
var/can_use = 1
var/obj/effect/dummy/chameleon/active_dummy = null
@@ -150,4 +150,4 @@
/obj/effect/dummy/chameleon/Destroy()
master.disrupt(0)
return ..()
return ..()

View File

@@ -4,7 +4,7 @@
icon_state = "flash"
item_state = "flashtool" //looks exactly like a flash (and nothing like a flashbang)
throwforce = 0
w_class = 1
w_class = WEIGHT_CLASS_TINY
throw_speed = 3
throw_range = 7
flags = CONDUCT

View File

@@ -4,7 +4,7 @@
icon = 'icons/obj/lighting.dmi'
icon_state = "flashlight"
item_state = "flashlight"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
slot_flags = SLOT_BELT
materials = list(MAT_METAL=50, MAT_GLASS=20)
@@ -88,7 +88,7 @@
desc = "A pen-sized light, used by medical staff."
icon_state = "penlight"
item_state = ""
w_class = 1
w_class = WEIGHT_CLASS_TINY
slot_flags = SLOT_BELT | SLOT_EARS
flags = CONDUCT
brightness_on = 2
@@ -109,7 +109,7 @@
item_state = ""
flags = CONDUCT
brightness_on = 2
w_class = 1
w_class = WEIGHT_CLASS_TINY
// the desk lamps are a bit special
/obj/item/device/flashlight/lamp
@@ -118,7 +118,7 @@
icon_state = "lamp"
item_state = "lamp"
brightness_on = 5
w_class = 4
w_class = WEIGHT_CLASS_BULKY
flags = CONDUCT
materials = list()
on = 1
@@ -153,7 +153,7 @@ obj/item/device/flashlight/lamp/bananalamp
/obj/item/device/flashlight/flare
name = "flare"
desc = "A red Nanotrasen issued flare. There are instructions on the side, it reads 'pull cord, make light'."
w_class = 2
w_class = WEIGHT_CLASS_SMALL
brightness_on = 8 // Made it brighter (from 7 to 8).
light_color = "#ff0000" // changed colour to a more brighter red.
icon_state = "flare"
@@ -214,7 +214,7 @@ obj/item/device/flashlight/lamp/bananalamp
/obj/item/device/flashlight/flare/torch
name = "torch"
desc = "A torch fashioned from some leaves and a log."
w_class = 4
w_class = WEIGHT_CLASS_BULKY
brightness_on = 7
icon_state = "torch"
item_state = "torch"
@@ -227,7 +227,7 @@ obj/item/device/flashlight/lamp/bananalamp
icon = 'icons/obj/lighting.dmi'
icon_state = "floor1" //not a slime extract sprite but... something close enough!
item_state = "slime"
w_class = 1
w_class = WEIGHT_CLASS_TINY
brightness_on = 6
light_color = "#FFBF00"
materials = list()

View File

@@ -3,37 +3,37 @@
/obj/item/device/floor_painter
name = "floor painter"
icon_state = "floor_painter"
var/floor_icon
var/floor_state = "floor"
var/floor_dir = SOUTH
w_class = 1
w_class = WEIGHT_CLASS_TINY
item_state = "electronic"
flags = CONDUCT
slot_flags = SLOT_BELT
var/static/list/allowed_states = list("arrival", "arrivalcorner", "bar", "barber", "blackcorner", "blue", "bluecorner",
var/static/list/allowed_states = list("arrival", "arrivalcorner", "bar", "barber", "blackcorner", "blue", "bluecorner",
"bluefull", "bluered", "blueyellow", "blueyellowfull", "bot", "brown", "browncorner", "browncornerold", "brownold",
"cafeteria", "caution", "cautioncorner", "chapel", "cmo", "dark", "delivery", "escape", "escapecorner", "floor",
"freezerfloor", "green", "greenblue", "greenbluefull", "greencorner", "greenfull", "greenyellow",
"greenyellowfull", "grimy", "loadingarea", "neutral", "neutralcorner", "neutralfull", "orange", "orangecorner",
"orangefull", "purple", "purplecorner", "purplefull", "rampbottom", "ramptop", "red", "redblue", "redbluefull",
"redcorner", "redfull", "redgreen", "redgreenfull", "redyellow", "redyellowfull", "warning", "warningcorner", "warnwhite",
"warnwhitecorner", "white", "whiteblue", "whitebluecorner", "whitebluefull", "whitebot", "whitecorner", "whitedelivery",
"whitegreen", "whitegreencorner", "whitegreenfull", "whitehall", "whitepurple", "whitepurplecorner", "whitepurplefull",
"whitered", "whiteredcorner", "whiteredfull", "whiteyellow", "whiteyellowcorner", "whiteyellowfull", "yellow",
"redcorner", "redfull", "redgreen", "redgreenfull", "redyellow", "redyellowfull", "warning", "warningcorner", "warnwhite",
"warnwhitecorner", "white", "whiteblue", "whitebluecorner", "whitebluefull", "whitebot", "whitecorner", "whitedelivery",
"whitegreen", "whitegreencorner", "whitegreenfull", "whitehall", "whitepurple", "whitepurplecorner", "whitepurplefull",
"whitered", "whiteredcorner", "whiteredfull", "whiteyellow", "whiteyellowcorner", "whiteyellowfull", "yellow",
"yellowcorner", "yellowcornersiding", "yellowsiding")
/obj/item/device/floor_painter/afterattack(var/atom/A, var/mob/user, proximity, params)
if(!proximity)
return
var/turf/simulated/floor/plasteel/F = A
if(!istype(F))
to_chat(user, "<span class='warning'>\The [src] can only be used on station flooring.</span>")
return
F.icon_state = floor_state
F.icon_regular_floor = floor_state
F.dir = floor_dir
@@ -60,7 +60,7 @@
<a href="?src=[UID()];choose_dir=1">Choose Direction</a>
<div class='statusDisplay'>Direction: [dir2text(floor_dir)]</div>
"}
var/datum/browser/popup = new(user, "floor_painter", name, 225, 300)
popup.set_content(dat)
popup.open()
@@ -68,7 +68,7 @@
/obj/item/device/floor_painter/Topic(href, href_list)
if(..())
return
if(href_list["choose_state"])
var/state = input("Please select a style", "[src]") as null|anything in allowed_states
if(state)
@@ -92,7 +92,7 @@
index = 1
floor_state = allowed_states[index]
floor_dir = SOUTH
floor_icon = icon('icons/turf/floors.dmi', floor_state, floor_dir)
if(usr)
attack_self(usr)

View File

@@ -8,7 +8,7 @@
flags = CONDUCT
slot_flags = SLOT_BELT
materials = list(MAT_METAL=500, MAT_GLASS=500)
w_class = 2 //Increased to 2, because diodes are w_class 2. Conservation of matter.
w_class = WEIGHT_CLASS_SMALL //Increased to 2, because diodes are w_class 2. Conservation of matter.
origin_tech = "combat=1"
origin_tech = "magnets=2"
var/energy = 5

View File

@@ -3,7 +3,7 @@
icon = 'icons/obj/aicards.dmi'
icon_state = "pai"
item_state = "electronic"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
origin_tech = "programming=2"
var/request_cooldown = 5 // five seconds

View File

@@ -5,7 +5,7 @@
desc = "A nulling power sink which drains energy from electrical systems."
icon_state = "powersink0"
item_state = "electronic"
w_class = 4
w_class = WEIGHT_CLASS_BULKY
flags = CONDUCT
throwforce = 5
throw_speed = 1

View File

@@ -6,7 +6,7 @@
frequency = 1449
flags = CONDUCT
slot_flags = SLOT_BACK
w_class = 5
w_class = WEIGHT_CLASS_HUGE
materials = list(MAT_METAL=10000, MAT_GLASS=2500)
var/code = 2

View File

@@ -3,7 +3,7 @@
desc = "Talk through this."
icon_state = "intercom"
anchored = 1
w_class = 4
w_class = WEIGHT_CLASS_BULKY
canhear_range = 2
flags = CONDUCT
var/number = 0
@@ -231,7 +231,7 @@
icon = 'icons/obj/doors/door_assembly.dmi'
icon_state = "door_electronics"
desc = "Looks like a circuit. Probably is."
w_class = 2
w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=50, MAT_GLASS=50)
toolspeed = 1
usesound = 'sound/items/Deconstruct.ogg'

View File

@@ -44,7 +44,7 @@ var/global/list/default_medbay_channels = list(
slot_flags = SLOT_BELT
throw_speed = 2
throw_range = 9
w_class = 2
w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=75)

View File

@@ -14,7 +14,7 @@ REAGENT SCANNER
icon_state = "t-ray0"
var/on = 0
slot_flags = SLOT_BELT
w_class = 2
w_class = WEIGHT_CLASS_SMALL
item_state = "electronic"
materials = list(MAT_METAL=150)
origin_tech = "magnets=1;engineering=1"
@@ -117,7 +117,7 @@ REAGENT SCANNER
flags = CONDUCT
slot_flags = SLOT_BELT
throwforce = 3
w_class = 1
w_class = WEIGHT_CLASS_TINY
throw_speed = 5
throw_range = 10
materials = list(MAT_METAL=200)
@@ -240,7 +240,7 @@ REAGENT SCANNER
if(H.species.exotic_blood)
user.show_message("<span class='warning'>Subject possesses exotic blood.</span>")
user.show_message("<span class='warning'>Exotic blood type: [blood_type].</span>")
if(H.heart_attack && H.stat != DEAD)
if(H.undergoing_cardiac_arrest() && H.stat != DEAD)
user.show_message("<span class='userdanger'>Subject suffering from heart attack: Apply defibrillator immediately.</span>")
user.show_message("<span class='notice'>Subject's pulse: <font color='[H.pulse == PULSE_THREADY || H.pulse == PULSE_NONE ? "red" : "blue"]'>[H.get_pulse(GETPULSE_TOOL)] bpm.</font></span>")
var/implant_detect
@@ -294,7 +294,7 @@ REAGENT SCANNER
name = "Health Analyzer Upgrade"
icon_state = "healthupgrade"
desc = "An upgrade unit that can be installed on a health analyzer for expanded functionality."
w_class = 1
w_class = WEIGHT_CLASS_TINY
origin_tech = "magnets=2;biotech=2"
usesound = 'sound/items/Deconstruct.ogg'
@@ -303,7 +303,7 @@ REAGENT SCANNER
name = "analyzer"
icon_state = "atmos"
item_state = "analyzer"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
slot_flags = SLOT_BELT
throwforce = 0
@@ -369,7 +369,7 @@ REAGENT SCANNER
name = "mass-spectrometer"
icon_state = "spectrometer"
item_state = "analyzer"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT | OPENCONTAINER
slot_flags = SLOT_BELT
throwforce = 5
@@ -470,7 +470,7 @@ REAGENT SCANNER
desc = "A hand-held reagent scanner which identifies chemical agents."
icon_state = "spectrometer"
item_state = "analyzer"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
slot_flags = SLOT_BELT
throwforce = 5
@@ -552,7 +552,7 @@ REAGENT SCANNER
icon_state = "adv_spectrometer_s"
item_state = "analyzer"
origin_tech = "biotech=1"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
throwforce = 0
throw_speed = 3
@@ -588,4 +588,4 @@ REAGENT SCANNER
user.show_message("Genetic destability: [T.mutation_chance]% chance of mutation on splitting", 1)
if(T.cores > 1)
user.show_message("Anomalous slime core amount detected", 1)
user.show_message("Growth progress: [T.amount_grown]/10", 1)
user.show_message("Growth progress: [T.amount_grown]/10", 1)

View File

@@ -3,7 +3,7 @@
desc = "A miniature machine that tracks suit sensors across the station."
icon = 'icons/obj/device.dmi'
icon_state = "scanner"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
origin_tech = "biotech=3;materials=3;magnets=3"
var/datum/nano_module/crew_monitor/crew_monitor
@@ -19,4 +19,4 @@
ui_interact(user)
/obj/item/device/sensor_device/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
crew_monitor.ui_interact(user, ui_key, ui, force_open)
crew_monitor.ui_interact(user, ui_key, ui, force_open)

View File

@@ -3,7 +3,7 @@
desc = "A device that can record to cassette tapes, and play them. It automatically translates the content in playback."
icon_state = "taperecorder_empty"
item_state = "analyzer"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
materials = list(MAT_METAL=60, MAT_GLASS=30)
force = 2
@@ -249,7 +249,7 @@
desc = "A magnetic tape that can hold up to ten minutes of content."
icon_state = "tape_white"
item_state = "analyzer"
w_class = 1
w_class = WEIGHT_CLASS_TINY
materials = list(MAT_METAL=20, MAT_GLASS=5)
force = 1
throwforce = 0

View File

@@ -19,7 +19,7 @@ effective or pretty fucking useless.
desc = "A strange device with twin antennas."
icon_state = "batterer"
throwforce = 5
w_class = 1
w_class = WEIGHT_CLASS_TINY
throw_speed = 4
throw_range = 10
flags = CONDUCT
@@ -79,7 +79,7 @@ effective or pretty fucking useless.
flags = CONDUCT
slot_flags = SLOT_BELT
throwforce = 3
w_class = 1
w_class = WEIGHT_CLASS_TINY
throw_speed = 3
throw_range = 7
materials = list(MAT_METAL=400)

View File

@@ -122,16 +122,16 @@
tank_one.forceMove(get_turf(src))
tank_one = null
update_icon()
if((!tank_two || tank_two.w_class < 4) && (w_class > 3))
w_class = 3
if((!tank_two || tank_two.w_class < WEIGHT_CLASS_BULKY) && (w_class > WEIGHT_CLASS_NORMAL))
w_class = WEIGHT_CLASS_NORMAL
else if(tank_two && href_list["tanktwo"])
split_gases()
valve_open = 0
tank_two.forceMove(get_turf(src))
tank_two = null
update_icon()
if((!tank_one || tank_one.w_class < 4) && (w_class > 3))
w_class = 3
if((!tank_one || tank_one.w_class < WEIGHT_CLASS_BULKY) && (w_class > WEIGHT_CLASS_NORMAL))
w_class = WEIGHT_CLASS_NORMAL
else if(href_list["open"])
toggle_valve()
else if(attached_device)
@@ -217,4 +217,4 @@
else if(valve_open && tank_one && tank_two)
split_gases()
valve_open = 0
update_icon()
update_icon()

View File

@@ -3,7 +3,7 @@
desc = "Used by obese officers to save their breath for running."
icon_state = "voice0"
item_state = "flashtool" //looks exactly like a flash (and nothing like a flashbang)
w_class = 1
w_class = WEIGHT_CLASS_TINY
flags = CONDUCT
var/spamcheck = 0
@@ -28,4 +28,3 @@
if(!emagged)
to_chat(user, "<span class='warning'>You overload \the [src]'s voice synthesizer.</span>")
emagged = 1

View File

@@ -5,7 +5,7 @@
icon_state = "docs_generic"
item_state = "paper"
throwforce = 0
w_class = 1
w_class = WEIGHT_CLASS_TINY
throw_range = 1
throw_speed = 1
layer = 4
@@ -26,4 +26,4 @@
/obj/item/documents/syndicate/blue
name = "'Blue' secret documents"
desc = "\"Top Secret\" documents printed on special copy-protected paper. It details sensitive Syndicate operational intelligence. These documents are marked \"Blue\"."
icon_state = "docs_blue"
icon_state = "docs_blue"

View File

@@ -1,6 +1,6 @@
/obj/item/flag
icon = 'icons/obj/flag.dmi'
w_class = 4
w_class = WEIGHT_CLASS_BULKY
burntime = 20
burn_state = FLAMMABLE
@@ -156,7 +156,7 @@
name = "Nar'Sie Cultist flag"
desc = "A flag proudly boasting the logo of the cultists, sworn enemies of NT."
icon_state = "cultflag"
//Chameleon
/obj/item/flag/chameleon
@@ -165,7 +165,7 @@
icon_state = "ntflag"
origin_tech = "materials=3;magnets=4;syndicate=4"
var/used = 0
/obj/item/flag/chameleon/attack_self(mob/user)
if(used)
return
@@ -190,7 +190,7 @@
icon_state = chosen_flag.icon_state
desc = chosen_flag.desc
used = 1
/obj/item/flag/chameleon/burn()
explosion(loc,1,2,4,4, flame_range = 4)
qdel(src)
qdel(src)

View File

@@ -5,7 +5,7 @@
item_state = "lgloves"
force = 0
throwforce = 0
w_class = 1
w_class = WEIGHT_CLASS_TINY
throw_speed = 1
throw_range = 7
var/state
@@ -60,4 +60,4 @@
blow(T, user)
return
if(is_sharp(W) || is_hot(W) || can_puncture(W))
burst()
burst()

View File

@@ -16,9 +16,9 @@
item_state = "beachball"
density = 0
anchored = 0
w_class = 1
w_class = WEIGHT_CLASS_TINY
force = 0.0
throwforce = 0.0
throw_speed = 1
throw_range = 20
flags = CONDUCT
flags = CONDUCT

View File

@@ -3,7 +3,7 @@
name = "tape roll"
icon = 'icons/policetape.dmi'
icon_state = "rollstart"
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/turf/start
var/turf/end
var/tape_type = /obj/item/tape
@@ -151,7 +151,7 @@ var/list/tape_roll_applications = list()
if(!density) return 1
if(height==0) return 1
if((mover.pass_flags & PASSTABLE || istype(mover, /obj/effect/meteor) || mover.throwing == 1) )
if((mover.pass_flags & PASSTABLE || istype(mover, /obj/effect/meteor) || mover.throwing))
return 1
else if(ismob(mover) && allowed(mover))
return 1
@@ -201,5 +201,3 @@ var/list/tape_roll_applications = list()
qdel(src)
return

View File

@@ -4,7 +4,7 @@
icon = 'icons/obj/items.dmi'
amount = 6
max_amount = 6
w_class = 1
w_class = WEIGHT_CLASS_TINY
throw_speed = 3
throw_range = 7
var/heal_brute = 0

View File

@@ -9,7 +9,7 @@ var/global/list/datum/stack_recipe/rod_recipes = list ( \
icon_state = "rods"
item_state = "rods"
flags = CONDUCT
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
force = 9.0
throwforce = 10.0
throw_speed = 3

View File

@@ -108,8 +108,8 @@ var/global/list/datum/stack_recipe/human_recipes = list( \
desc = "Long stringy filaments which presumably came from a watcher's wings."
singular_name = "watcher sinew"
icon_state = "sinew"
origin_tech = "biotech=4"
origin_tech = "biotech=4"
var/global/list/datum/stack_recipe/sinew_recipes = list ( \
new/datum/stack_recipe("sinew restraints", /obj/item/weapon/restraints/handcuffs/sinew, 1, on_floor = 1), \
)
@@ -117,7 +117,7 @@ var/global/list/datum/stack_recipe/sinew_recipes = list ( \
/obj/item/stack/sheet/sinew/New(var/loc, var/amount=null)
recipes = sinew_recipes
return ..()
/obj/item/stack/sheet/animalhide/goliath_hide
name = "goliath hide plates"
desc = "Pieces of a goliath's rocky hide, these might be able to make your suit a bit more durable to attack from the local fauna."
@@ -125,7 +125,7 @@ var/global/list/datum/stack_recipe/sinew_recipes = list ( \
icon_state = "goliath_hide"
singular_name = "hide plate"
flags = NOBLUDGEON
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
layer = MOB_LAYER
/obj/item/stack/sheet/animalhide/ashdrake
@@ -135,9 +135,9 @@ var/global/list/datum/stack_recipe/sinew_recipes = list ( \
icon_state = "dragon_hide"
singular_name = "drake plate"
flags = NOBLUDGEON
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
layer = MOB_LAYER
//Step one - dehairing.
/obj/item/stack/sheet/animalhide/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
@@ -177,4 +177,4 @@ var/global/list/datum/stack_recipe/sinew_recipes = list ( \
var/obj/item/stack/sheet/leather/HS = new(src.loc)
HS.amount = 1
wetness = initial(wetness)
src.use(1)
src.use(1)

View File

@@ -5,7 +5,7 @@
desc = "A glass tile, which is wired, somehow."
icon = 'icons/obj/tiles.dmi'
icon_state = "glass_wire"
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
force = 3.0
throwforce = 5.0
throw_speed = 5

View File

@@ -104,7 +104,7 @@ var/global/list/datum/stack_recipe/abductor_recipes = list ( \
/obj/item/stack/sheet/mineral
force = 5.0
throwforce = 5
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
throw_speed = 3
throw_range = 3
@@ -240,7 +240,7 @@ var/global/list/datum/stack_recipe/abductor_recipes = list ( \
singular_name = "alien alloy sheet"
force = 5
throwforce = 5
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
throw_speed = 1
throw_range = 3
origin_tech = "materials=6;abductor=1"
@@ -248,4 +248,4 @@ var/global/list/datum/stack_recipe/abductor_recipes = list ( \
/obj/item/stack/sheet/mineral/abductor/New(loc, amount=null)
recipes = abductor_recipes
..()
..()

View File

@@ -298,7 +298,7 @@ var/global/list/datum/stack_recipe/runed_metal_recipes = list ( \
desc = "Someone's been drinking their milk."
force = 7
throwforce = 5
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
throw_speed = 1
throw_range = 3
origin_tech = "materials=2;biotech=2"

View File

@@ -1,6 +1,6 @@
/obj/item/stack/sheet
name = "sheet"
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
force = 5
throwforce = 5
max_amount = 50
@@ -24,4 +24,4 @@
else
for(var/obj/item/stack/sheet/stack in locate(src.x,src.y,src.z))
S.add(stack,user)
..()*/
..()*/

View File

@@ -5,7 +5,7 @@
singular_name = "telecrystal"
icon = 'icons/obj/telescience.dmi'
icon_state = "telecrystal"
w_class = 1
w_class = WEIGHT_CLASS_TINY
max_amount = 50
flags = NOBLUDGEON
origin_tech = "materials=6;syndicate=1"

View File

@@ -5,7 +5,7 @@
icon = 'icons/obj/tiles.dmi'
icon_state = "tile"
item_state = "tile"
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
force = 1
throwforce = 1
throw_speed = 5
@@ -160,4 +160,4 @@
singular_name = "pod floor tile"
desc = "A grooved floor tile."
icon_state = "tile_pod"
turf_type = /turf/simulated/floor/pod
turf_type = /turf/simulated/floor/pod

View File

@@ -113,7 +113,7 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "syndballoon"
item_state = "syndballoon"
w_class = 4
w_class = WEIGHT_CLASS_BULKY
/*
* Fake telebeacon
@@ -144,7 +144,7 @@
icon_state = "sword0"
item_state = "sword0"
var/active = 0.0
w_class = 2
w_class = WEIGHT_CLASS_SMALL
attack_verb = list("attacked", "struck", "hit")
/obj/item/toy/sword/attack_self(mob/user as mob)
@@ -154,13 +154,13 @@
playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
icon_state = "swordblue"
item_state = "swordblue"
w_class = 4
w_class = WEIGHT_CLASS_BULKY
else
to_chat(user, "<span class='notice'>You push the plastic blade back down into the handle.</span>")
playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
icon_state = "sword0"
item_state = "sword0"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
@@ -218,7 +218,7 @@
slot_flags = SLOT_BELT | SLOT_BACK
force = 5
throwforce = 5
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
attack_verb = list("attacked", "slashed", "stabbed", "sliced")
hitsound = 'sound/weapons/bladeslice.ogg'
@@ -239,7 +239,7 @@
throwforce = 5.0
throw_speed = 10
throw_range = 30
w_class = 1
w_class = WEIGHT_CLASS_TINY
/obj/item/toy/snappop/virus/throw_impact(atom/hit_atom)
@@ -260,7 +260,7 @@
desc = "Wow!"
icon = 'icons/obj/toy.dmi'
icon_state = "snappop"
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/ash_type = /obj/effect/decal/cleanable/ash
/obj/item/toy/snappop/proc/pop_burst(var/n=3, var/c=1)
@@ -403,7 +403,7 @@
slot_flags = SLOT_BELT | SLOT_BACK
force = 5
throwforce = 5
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
attack_verb = list("attacked", "slashed", "stabbed", "sliced")
@@ -438,7 +438,7 @@ obj/item/toy/cards/deck
icon = 'icons/obj/toy.dmi'
deckstyle = "nanotrasen"
icon_state = "deck_nanotrasen_full"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
var/list/cards = list()
@@ -568,7 +568,7 @@ obj/item/toy/cards/cardhand
desc = "A number of cards not in a deck, customarily held in ones hand."
icon = 'icons/obj/toy.dmi'
icon_state = "nanotrasen_hand2"
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/list/currenthand = list()
var/choice = null
@@ -661,7 +661,7 @@ obj/item/toy/cards/singlecard
desc = "a card"
icon = 'icons/obj/toy.dmi'
icon_state = "singlecard_nanotrasen_down"
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/cardname = null
var/flipped = 0
pixel_x = -5
@@ -787,7 +787,7 @@ obj/item/toy/cards/deck/syndicate/black
desc = "A plastic model of a Nuclear Fission Explosive."
icon = 'icons/obj/toy.dmi'
icon_state = "nuketoyidle"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
/obj/item/toy/nuke/attack_self(mob/user)
@@ -810,7 +810,7 @@ obj/item/toy/cards/deck/syndicate/black
desc = "A toy for therapeutic and recreational purposes."
icon_state = "therapyred"
item_state = "egg4"
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/cooldown = 0
/obj/item/toy/therapy/New()
@@ -863,7 +863,7 @@ obj/item/toy/cards/deck/syndicate/black
name = "toddler"
desc = "This baby looks almost real. Wait, did it just burp?"
force = 5
w_class = 4
w_class = WEIGHT_CLASS_BULKY
slot_flags = SLOT_BACK
@@ -886,7 +886,7 @@ obj/item/toy/cards/deck/syndicate/black
desc = "Relive the excitement of a meteor shower! SweetMeat-eor. Co is not responsible for any injuries, headaches or hearing loss caused by Mini-Meteor."
icon = 'icons/obj/toy.dmi'
icon_state = "minimeteor"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
/obj/item/toy/minimeteor/throw_impact(atom/hit_atom)
..()
@@ -1095,7 +1095,7 @@ obj/item/toy/cards/deck/syndicate/black
icon_state = "foamblade"
item_state = "arm_blade"
attack_verb = list("pricked", "absorbed", "gored")
w_class = 2
w_class = WEIGHT_CLASS_SMALL
burn_state = FLAMMABLE
/*
@@ -1107,7 +1107,7 @@ obj/item/toy/cards/deck/syndicate/black
icon = 'icons/obj/device.dmi'
icon_state = "flash"
item_state = "flashtool"
w_class = 1
w_class = WEIGHT_CLASS_TINY
/obj/item/toy/flash/attack(mob/living/M, mob/user)
playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1)
@@ -1123,7 +1123,7 @@ obj/item/toy/cards/deck/syndicate/black
desc = "A big, plastic red button. Reads 'From HonkCo Pranks?' on the back."
icon = 'icons/obj/assemblies.dmi'
icon_state = "bigred"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
/obj/item/toy/redbutton/attack_self(mob/user)
@@ -1148,7 +1148,7 @@ obj/item/toy/cards/deck/syndicate/black
desc = "A little toy model AI core with real law announcing action!"
icon = 'icons/obj/toy.dmi'
icon_state = "AI"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
/obj/item/toy/AI/attack_self(mob/user)
@@ -1167,7 +1167,7 @@ obj/item/toy/cards/deck/syndicate/black
desc = "An action figure modeled after 'The Owl', defender of justice."
icon = 'icons/obj/toy.dmi'
icon_state = "owlprize"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
/obj/item/toy/owl/attack_self(mob/user)
@@ -1186,7 +1186,7 @@ obj/item/toy/cards/deck/syndicate/black
desc = "An action figure modeled after 'The Griffin', criminal mastermind."
icon = 'icons/obj/toy.dmi'
icon_state = "griffinprize"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
/obj/item/toy/griffin/attack_self(mob/user)
@@ -1203,7 +1203,7 @@ obj/item/toy/cards/deck/syndicate/black
// DND Character minis. Use the naming convention (type)character for the icon states.
/obj/item/toy/character
icon = 'icons/obj/toy.dmi'
w_class = 2
w_class = WEIGHT_CLASS_SMALL
pixel_z = 5
/obj/item/toy/character/alien
@@ -1256,7 +1256,7 @@ obj/item/toy/cards/deck/syndicate/black
desc = "The perfect pet!"
icon = 'icons/obj/toy.dmi'
icon_state = "pet_rock"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
force = 5
throwforce = 5
attack_verb = list("attacked", "bashed", "smashed", "stoned")
@@ -1280,7 +1280,7 @@ obj/item/toy/cards/deck/syndicate/black
icon = 'icons/obj/toy.dmi'
icon_state = "minigibber"
attack_verb = list("grinded", "gibbed")
w_class = 2
w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
var/obj/stored_minature = null
@@ -1322,7 +1322,7 @@ obj/item/toy/cards/deck/syndicate/black
icon_state = "toy_xeno"
name = "xenomorph action figure"
desc = "MEGA presents the new Xenos Isolated action figure! Comes complete with realistic sounds! Pull back string to use."
w_class = 2
w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
/obj/item/toy/toy_xeno/attack_self(mob/user)
@@ -1352,7 +1352,7 @@ obj/item/toy/cards/deck/syndicate/black
flags = CONDUCT
slot_flags = SLOT_BELT
materials = list(MAT_METAL=2000)
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
throwforce = 5
throw_speed = 4
throw_range = 5

View File

@@ -4,7 +4,7 @@
//Added by Jack Rost
/obj/item/trash
icon = 'icons/obj/trash.dmi'
w_class = 1
w_class = WEIGHT_CLASS_TINY
desc = "This is rubbish."
burn_state = FLAMMABLE

View File

@@ -14,7 +14,7 @@ AI MODULES
desc = "An AI Module for transmitting encrypted instructions to the AI."
flags = CONDUCT
force = 5.0
w_class = 2
w_class = WEIGHT_CLASS_SMALL
throwforce = 5.0
throw_speed = 3
throw_range = 15
@@ -397,4 +397,4 @@ AI MODULES
laws[1] = generate_ion_law()
to_chat(user, "<span class='notice'>You press the button on [src].</span>")
playsound(user, 'sound/machines/click.ogg', 20, 1)
src.loc.visible_message("<span class='warning'>[bicon(src)] [laws[1]]</span>")
src.loc.visible_message("<span class='warning'>[bicon(src)] [laws[1]]</span>")

View File

@@ -17,7 +17,7 @@ RCD
throwforce = 10.0
throw_speed = 3
throw_range = 5
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
materials = list(MAT_METAL = 30000)
origin_tech = "engineering=4;materials=2"
toolspeed = 1
@@ -279,8 +279,7 @@ RCD
return 0
activate()
var/turf/T1 = get_turf(A)
qdel(A)
A = null
QDEL_NULL(A)
for(var/obj/structure/window/W in T1.contents)
W.disassembled = 1
W.density = 0

View File

@@ -115,7 +115,7 @@
last = C
break
/obj/item/weapon/twohanded/rcl/moved(mob/user, turf/old_loc, direct)
/obj/item/weapon/twohanded/rcl/on_mob_move(direct, mob/user)
if(active)
trigger(user)

View File

@@ -13,7 +13,7 @@ RSF
anchored = 0.0
var/matter = 0
var/mode = 1
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
/obj/item/weapon/rsf/New()
desc = "A RSF. It currently holds [matter]/30 fabrication-units."
@@ -231,4 +231,4 @@ RSF
matter--
to_chat(user, "The RSF now holds [matter]/30 fabrication-units.")
desc = "A RSF. It currently holds [matter]/30 fabrication-units."
return
return

View File

@@ -12,8 +12,8 @@
throwforce_on = 5
throw_speed = 1
throw_range = 5
w_class = 2
w_class_on = 2
w_class = WEIGHT_CLASS_SMALL
w_class_on = WEIGHT_CLASS_SMALL
attack_verb = list("attacked", "slashed", "gored", "sliced", "torn", "ripped", "butchered", "cut")
attack_verb_on = list()

View File

@@ -11,7 +11,7 @@
force = 10
throw_speed = 2
throw_range = 4
w_class = 4
w_class = WEIGHT_CLASS_BULKY
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
var/bees_left = 10
var/list/blood_list = list()

View File

@@ -15,7 +15,7 @@
name = "card"
desc = "A card."
icon = 'icons/obj/card.dmi'
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/associated_account_number = 0
var/list/files = list( )

View File

@@ -7,7 +7,7 @@
throwforce = 3.0
throw_speed = 1
throw_range = 5
w_class = 2
w_class = WEIGHT_CLASS_SMALL
attack_verb = list("warned", "cautioned", "smashed")
proximity_sign

View File

@@ -6,7 +6,7 @@
icon = 'icons/obj/chronos.dmi'
icon_state = "chronobackpack"
item_state = "backpack"
w_class = 4
w_class = WEIGHT_CLASS_BULKY
slot_flags = SLOT_BACK
slowdown = 1
actions_types = list(/datum/action/item_action/equip_unequip_TED_Gun)
@@ -46,7 +46,7 @@
icon = 'icons/obj/chronos.dmi'
icon_state = "chronogun"
item_state = "chronogun"
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
flags = NODROP
ammo_type = list(/obj/item/ammo_casing/energy/chrono_beam)
can_charge = 0

View File

@@ -20,7 +20,7 @@ LIGHTERS ARE IN LIGHTERS.DM
throw_speed = 0.5
item_state = "cigoff"
slot_flags = SLOT_EARS|SLOT_MASK
w_class = 1
w_class = WEIGHT_CLASS_TINY
body_parts_covered = null
attack_verb = list("burnt", "singed")
var/lit = 0
@@ -285,7 +285,7 @@ LIGHTERS ARE IN LIGHTERS.DM
desc = "A manky old cigarette butt."
icon = 'icons/obj/clothing/masks.dmi'
icon_state = "cigbutt"
w_class = 1
w_class = WEIGHT_CLASS_TINY
throwforce = 1
/obj/item/weapon/cigbutt/New()
@@ -389,7 +389,7 @@ LIGHTERS ARE IN LIGHTERS.DM
desc = "A thin piece of paper used to make fine smokeables."
icon = 'icons/obj/cigarettes.dmi'
icon_state = "cig_paper"
w_class = 1
w_class = WEIGHT_CLASS_TINY
/obj/item/weapon/rollingpaper/afterattack(atom/target, mob/user, proximity)
if(!proximity)
@@ -410,4 +410,4 @@ LIGHTERS ARE IN LIGHTERS.DM
else
to_chat(user, "<span class='warning'>You need to dry this first!</span>")
else
..()
..()

View File

@@ -60,7 +60,7 @@
item_state = "bike_horn"
hitsound = null
throwforce = 3
w_class = 1
w_class = WEIGHT_CLASS_TINY
throw_speed = 3
throw_range = 15
attack_verb = list("HONKED")
@@ -112,4 +112,4 @@
var/mob/living/carbon/human/H = M
if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs) || H.ear_deaf)
continue
M.emote("flip")
M.emote("flip")

View File

@@ -3,7 +3,7 @@
desc = "A generic brand of lipstick."
icon = 'icons/obj/items.dmi'
icon_state = "lipstick"
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/colour = "red"
var/open = 0
@@ -86,7 +86,7 @@
icon = 'icons/obj/items.dmi'
icon_state = "razor"
flags = CONDUCT
w_class = 1
w_class = WEIGHT_CLASS_TINY
usesound = 'sound/items/Welder2.ogg'
toolspeed = 1
@@ -136,6 +136,9 @@
if(C.h_style == "Bald" || C.h_style == "Balding Hair" || C.h_style == "Skinhead")
to_chat(user, "<span class='notice'>There is not enough hair left to shave...</span>")
return
if(M.get_species() == "Skrell")
to_chat(user, "<span class='warning'>Your razor isn't going to cut through tentacles.</span>")
return
if(H == user) //shaving yourself
user.visible_message("<span class='warning'>[user] starts to shave their head with \the [src].</span>", \
"<span class='warning'>You start to shave your head with \the [src].</span>")
@@ -160,4 +163,4 @@
else
..()
else
..()
..()

View File

@@ -9,7 +9,7 @@
icon_state = "gavelhammer"
force = 5.0
throwforce = 6.0
w_class = 2
w_class = WEIGHT_CLASS_SMALL
attack_verb = list("bashed", "battered", "judged", "whacked")
burn_state = FLAMMABLE
@@ -25,7 +25,7 @@
icon_state = "gavelblock"
force = 2.0
throwforce = 2.0
w_class = 1
w_class = WEIGHT_CLASS_TINY
burn_state = FLAMMABLE
/obj/item/weapon/gavelblock/attackby(obj/item/I, mob/user, params)
@@ -33,4 +33,4 @@
playsound(loc, 'sound/items/gavel.ogg', 100, 1)
user.visible_message("<span class='warning'>[user] strikes \the [src] with \the [I].</span>")
else
return
return

Some files were not shown because too many files have changed in this diff Show More