mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-17 11:05:16 +01:00
Merge branch 'master' of https://github.com/tgstation/-tg-station into dalawisfluid
Conflicts: code/game/objects/items/weapons/AI_modules.dm code/modules/research/designs.dm maps/tgstation.2.1.2.dmm
This commit is contained in:
@@ -0,0 +1,174 @@
|
||||
/tg/station 13 v1.0 - 6 October 2010
|
||||
|
||||
Website: http://ss13.eu
|
||||
|
||||
Code: https://github.com/tgstation/-tg-station
|
||||
|
||||
IRC: irc://irc.rizon.net/coderbus
|
||||
|
||||
# DOWNLOADING
|
||||
|
||||
There are a number of ways to download the source code. Some are described here, an alternative all-inclusive guide is also located at http://wiki.ss13.eu/index.php/Downloading_the_source_code
|
||||
|
||||
Option 1: Download the source code as a zip by clicking the ZIP button in the
|
||||
code tab of https://github.com/tgstation/-tg-station
|
||||
(note: this will use a lot of bandwidth if you wish to update and is a lot of
|
||||
hassle if you want to make any changes at all, so it's not recommended.)
|
||||
|
||||
(Options 2/3): Install Git-scm from here first: http://git-scm.com/download/win
|
||||
|
||||
Option 2:
|
||||
Install GitHub::windows from http://windows.github.com/
|
||||
It handles most of the setup and configuraton of Git for you.
|
||||
Then you simply search for the -tg-station repository and click the big clone
|
||||
button.
|
||||
|
||||
Option 3:
|
||||
Follow this: http://wiki.ss13.eu/index.php/Setting_up_git
|
||||
(It's recommended that you use git-scm, as above, rather than the git CLI
|
||||
suggested by the guide)
|
||||
|
||||
#INSTALLATION
|
||||
|
||||
First-time installation should be fairly straightforward. First, you'll need
|
||||
BYOND installed. You can get it from http://www.byond.com/. Once you've done
|
||||
that, extract the game files to wherever you want to keep them. This is a
|
||||
sourcecode-only release, so the next step is to compile the server files.
|
||||
Open tgstation.dme by double-clicking it, open the Build menu, and click
|
||||
compile. This'll take a little while, and if everything's done right you'll get
|
||||
a message like this:
|
||||
|
||||
```
|
||||
saving tgstation.dmb (DEBUG mode)
|
||||
tgstation.dmb - 0 errors, 0 warnings
|
||||
```
|
||||
|
||||
If you see any errors or warnings, something has gone wrong - possibly a corrupt
|
||||
download or the files extracted wrong. If problems persist, ask for assistance
|
||||
in irc://irc.rizon.net/coderbus
|
||||
|
||||
Once that's done, open up the config folder. You'll want to edit config.txt to
|
||||
set the probabilities for different gamemodes in Secret and to set your server
|
||||
location so that all your players don't get disconnected at the end of each
|
||||
round. It's recommended you don't turn on the gamemodes with probability 0,
|
||||
except Extended, as they have various issues and aren't currently being tested,
|
||||
so they may have unknown and bizarre bugs. Extended is essentially no mode, and
|
||||
isn't in the Secret rotation by default as it's just not very fun.
|
||||
|
||||
You'll also want to edit config/admins.txt to remove the default admins and add
|
||||
your own. "Game Master" is the highest level of access, and probably the one
|
||||
you'll want to use for now. You can set up your own ranks and find out more in
|
||||
config/admin_ranks.txt
|
||||
|
||||
The format is
|
||||
|
||||
```
|
||||
byondkey = Rank
|
||||
```
|
||||
|
||||
where the admin rank must be properly capitalised.
|
||||
|
||||
Finally, to start the server, run Dream Daemon and enter the path to your
|
||||
compiled tgstation.dmb file. Make sure to set the port to the one you
|
||||
specified in the config.txt, and set the Security box to 'Safe'. Then press GO
|
||||
and the server should start up and be ready to join.
|
||||
|
||||
#UPDATING
|
||||
|
||||
To update an existing installation, first back up your /config and /data folders
|
||||
as these store your server configuration, player preferences and banlist.
|
||||
|
||||
Then, extract the new files (preferably into a clean directory, but updating in
|
||||
place should work fine), copy your /config and /data folders back into the new
|
||||
install, overwriting when prompted except if we've specified otherwise, and
|
||||
recompile the game. Once you start the server up again, you should be running
|
||||
the new version.
|
||||
|
||||
#SQL SETUP
|
||||
|
||||
The SQL backend for the library and stats tracking requires a
|
||||
MySQL server. Your server details go in /config/dbconfig.txt, and the SQL
|
||||
schema is in /SQL/tgstation_schema.sql. More detailed setup instructions are located here: http://wiki.ss13.eu/index.php/Downloading_the_source_code#Setting_up_the_database
|
||||
|
||||
#IRC BOT SETUP
|
||||
|
||||
Included in the SVN is an IRC bot capable of relaying adminhelps to a specified
|
||||
IRC channel/server (thanks to Skibiliano).
|
||||
Instructions for bot setup are included in the /bot folder along with the script
|
||||
itself
|
||||
|
||||
#CONTRIBUTING
|
||||
Everyone is free to contribute to this project as long as they follow these simple guidelines and specifications.
|
||||
|
||||
**Introduction**
|
||||
|
||||
As a goal to increase code maintainability we are going to be requiring all pull requests to hold up to the standards mentioned below. This is in order for all of us to benefit, instead of having to fix the same bug more than once because of duplicated code.
|
||||
|
||||
But first we want to make it clear over what powers the maintainers have over your pull request, so you do not get any surprises when submitting pull requests and it is closed for a reason you did not suspect.
|
||||
|
||||
Maintainers are quality control. If a proposed pull request does not meet the mentioned quality specifications then it can be closed if you fail to satisfy them. Maintainers are required to give a reason for closing the pull request.
|
||||
|
||||
Maintainers can revert your changes if they feel they are not worth maintaining or if they did not live up to the quality specifications.
|
||||
|
||||
Headcoders, which are elected by the maintainers and members of the project, have complete control over what goes through and what is reverted. They are encouraged to take control in what features are added to the game. It is encouraged that if you do not want to waste time working on a feature, that might be denied, that you ask a head coder first.
|
||||
|
||||
**Specification**
|
||||
|
||||
As BYOND's Dream Maker is an object oriented language, code must be object oriented when possible in order to be more flexible when adding content to it.
|
||||
|
||||
You must write BYOND code with absolute pathing, like so:
|
||||
|
||||
```DM
|
||||
|
||||
/obj/item/weapon/baseball_bat
|
||||
name = "baseball bat"
|
||||
desc = "A baseball bat."
|
||||
var/wooden = 1
|
||||
|
||||
/obj/item/weapon/baseball_bat/examine()
|
||||
if(wooden)
|
||||
desc = "A wooden baseball bat."
|
||||
else
|
||||
desc = "A metal baseball bat."
|
||||
..()
|
||||
|
||||
```
|
||||
|
||||
You must not use colons to override safety checks on an object's variable/function, instead of using proper type casting.
|
||||
|
||||
It is rarely allowed to put type paths in a text format, as they is no compile errors if the type path no longer exists.
|
||||
|
||||
You must use tabs to indent your code.
|
||||
|
||||
Hacky code, such as adding specific checks, is highly discouraged and only allowed when there is no other option. You can avoid hacky code by using object oriented methodologies, such as overriding a function (called procs in DM) or sectioning code into functions and then overriding them as required.
|
||||
|
||||
Duplicated code is 99% of the time never allowed. Copying code from one place to another maybe suitable for small short time projects but /tg/station focuses on the long term and thus discourages this. Instead you can use object orientation, or simply placing repeated code in a function, to obey this specification easily.
|
||||
|
||||
Code should be modular where possible, if you are working on a new class then it is best if you put it in a new file.
|
||||
|
||||
Bloated code may be necessary to add a certain feature, which means there has to be a judgement over whether the feature is worth having or not. You can help make this decision easier by making sure your code is modular.
|
||||
|
||||
You are expected to help maintain the code that you add, meaning if there is a problem then you are likely to be approached in order to fix any issues, runtimes or bugs.
|
||||
|
||||
**Other Requirements/Information**
|
||||
|
||||
Pull requests will sometimes take a while before they are looked at by a maintainer, the bigger the change the more time it will take before they are accepted into the code.
|
||||
|
||||
You are expected to document all your changes in the pull request, failing to do so will risk delaying it. On the other hand you can speed up the process by making the pull request readable and easy to understand, with diagrams or before/after data.
|
||||
|
||||
If you are proposing multiple changes, which change many different aspects of the code, you are to section them off into different pull requests in order to easily review them and to deny/accept the changes that are deemed acceptable.
|
||||
|
||||
If your pull request is accepted, the code you add is no longer yours but everyones, everyone is free to work on it but you are also free to object to any changes being made, which will be noted by a headcoder.
|
||||
|
||||
**Getting Started**
|
||||
|
||||
We have a [list of guides on the wiki](http://wiki.ss13.eu/index.php/Guides#Development_and_Contribution_Guides) which will help you get started contributing to /tg/station with git and Dream Maker.
|
||||
|
||||
For beginners, it is recommended you work on small projects, at first. There is an easy list of issues which are [contributor friendly, here](https://github.com/tgstation/-tg-station/issues?labels=Contributor+Friendly&page=1&state=open).
|
||||
|
||||
#LICENSE
|
||||
|
||||
All code is under a GNU GPL v3 license (http://www.gnu.org/licenses/gpl.html),
|
||||
including tools unless their readme specifies otherwise.
|
||||
All content including icons and sound is under a Creative Commons 3.0 BY-SA
|
||||
license (http://creativecommons.org/licenses/by-sa/3.0/).
|
||||
-112
@@ -1,112 +0,0 @@
|
||||
/tg/station 13 v1.0 - 6 October 2010
|
||||
|
||||
Website: http://ss13.eu
|
||||
Code: https://github.com/tgstation/-tg-station
|
||||
IRC: irc://irc.rizon.net/coderbus
|
||||
|
||||
================================================================================
|
||||
DOWNLOADING
|
||||
================================================================================
|
||||
There are a number of ways to download the source code. Some are described here, an alternative all-inclusive guide is also located at http://wiki.ss13.eu/index.php/Downloading_the_source_code
|
||||
|
||||
Option 1: Download the source code as a zip by clicking the ZIP button in the
|
||||
code tab of https://github.com/tgstation/-tg-station
|
||||
(note: this will use a lot of bandwidth if you wish to update and is a lot of
|
||||
hassle if you want to make any changes at all, so it's not recommended.)
|
||||
|
||||
(Options 2/3): Install Git-scm from here first: http://git-scm.com/download/win
|
||||
|
||||
Option 2:
|
||||
Install GitHub::windows from http://windows.github.com/
|
||||
It handles most of the setup and configuraton of Git for you.
|
||||
Then you simply search for the -tg-station repository and click the big clone
|
||||
button.
|
||||
|
||||
Option 3:
|
||||
Follow this: http://wiki.ss13.eu/index.php/Setting_up_git
|
||||
(It's recommended that you use git-scm, as above, rather than the git CLI
|
||||
suggested by the guide)
|
||||
|
||||
================================================================================
|
||||
INSTALLATION
|
||||
================================================================================
|
||||
|
||||
First-time installation should be fairly straightforward. First, you'll need
|
||||
BYOND installed. You can get it from http://www.byond.com/. Once you've done
|
||||
that, extract the game files to wherever you want to keep them. This is a
|
||||
sourcecode-only release, so the next step is to compile the server files.
|
||||
Open tgstation.dme by double-clicking it, open the Build menu, and click
|
||||
compile. This'll take a little while, and if everything's done right you'll get
|
||||
a message like this:
|
||||
|
||||
saving tgstation.dmb (DEBUG mode)
|
||||
|
||||
tgstation.dmb - 0 errors, 0 warnings
|
||||
|
||||
If you see any errors or warnings, something has gone wrong - possibly a corrupt
|
||||
download or the files extracted wrong. If problems persist, ask for assistance
|
||||
in irc://irc.rizon.net/coderbus
|
||||
|
||||
Once that's done, open up the config folder. You'll want to edit config.txt to
|
||||
set the probabilities for different gamemodes in Secret and to set your server
|
||||
location so that all your players don't get disconnected at the end of each
|
||||
round. It's recommended you don't turn on the gamemodes with probability 0,
|
||||
except Extended, as they have various issues and aren't currently being tested,
|
||||
so they may have unknown and bizarre bugs. Extended is essentially no mode, and
|
||||
isn't in the Secret rotation by default as it's just not very fun.
|
||||
|
||||
You'll also want to edit config/admins.txt to remove the default admins and add
|
||||
your own. "Game Master" is the highest level of access, and probably the one
|
||||
you'll want to use for now. You can set up your own ranks and find out more in
|
||||
config/admin_ranks.txt
|
||||
|
||||
The format is
|
||||
|
||||
byondkey = Rank
|
||||
|
||||
where the admin rank must be properly capitalised.
|
||||
|
||||
Finally, to start the server, run Dream Daemon and enter the path to your
|
||||
compiled tgstation.dmb file. Make sure to set the port to the one you
|
||||
specified in the config.txt, and set the Security box to 'Safe'. Then press GO
|
||||
and the server should start up and be ready to join.
|
||||
|
||||
================================================================================
|
||||
UPDATING
|
||||
================================================================================
|
||||
|
||||
To update an existing installation, first back up your /config and /data folders
|
||||
as these store your server configuration, player preferences and banlist.
|
||||
|
||||
Then, extract the new files (preferably into a clean directory, but updating in
|
||||
place should work fine), copy your /config and /data folders back into the new
|
||||
install, overwriting when prompted except if we've specified otherwise, and
|
||||
recompile the game. Once you start the server up again, you should be running
|
||||
the new version.
|
||||
|
||||
================================================================================
|
||||
SQL SETUP
|
||||
================================================================================
|
||||
|
||||
The SQL backend for the library and stats tracking requires a
|
||||
MySQL server. Your server details go in /config/dbconfig.txt, and the SQL
|
||||
schema is in /SQL/tgstation_schema.sql. More detailed setup instructions are located here: http://wiki.ss13.eu/index.php/Downloading_the_source_code#Setting_up_the_database
|
||||
|
||||
================================================================================
|
||||
IRC BOT SETUP
|
||||
================================================================================
|
||||
|
||||
Included in the SVN is an IRC bot capable of relaying adminhelps to a specified
|
||||
IRC channel/server (thanks to Skibiliano).
|
||||
Instructions for bot setup are included in the /bot folder along with the script
|
||||
itself
|
||||
|
||||
|
||||
================================================================================
|
||||
LICENSE
|
||||
================================================================================
|
||||
|
||||
All code is under a GNU GPL v3 license (http://www.gnu.org/licenses/gpl.html),
|
||||
including tools unless their readme specifies otherwise.
|
||||
All content including icons and sound is under a Creative Commons 3.0 BY-SA
|
||||
license (http://creativecommons.org/licenses/by-sa/3.0/).
|
||||
@@ -312,11 +312,3 @@ obj/machinery/atmospherics/valve
|
||||
close()
|
||||
else
|
||||
open()
|
||||
|
||||
attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
|
||||
if (!istype(W, /obj/item/weapon/wrench))
|
||||
return ..()
|
||||
if (istype(src, /obj/machinery/atmospherics/valve/digital))
|
||||
user << "\red You cannot unwrench this [src], it's too complicated."
|
||||
return 1
|
||||
return ..()
|
||||
+27
-14
@@ -32,16 +32,22 @@ datum/controller/air_system
|
||||
if(kill_air)
|
||||
return 1
|
||||
|
||||
for(var/i=0,i<speed,i++)
|
||||
current_cycle++
|
||||
|
||||
process_active_turfs()
|
||||
process_excited_groups()
|
||||
process_high_pressure_delta()
|
||||
process_hotspots()
|
||||
process_super_conductivity()
|
||||
if(speed > 1)
|
||||
for(var/i=0,i<speed,i++)
|
||||
spawn((10/speed)*i)
|
||||
process_air()
|
||||
else
|
||||
process_air()
|
||||
return 1
|
||||
|
||||
/datum/controller/air_system/proc/process_air()
|
||||
current_cycle++
|
||||
process_active_turfs()
|
||||
process_excited_groups()
|
||||
process_high_pressure_delta()
|
||||
process_hotspots()
|
||||
process_super_conductivity()
|
||||
|
||||
/datum/controller/air_system/proc/process_hotspots()
|
||||
for(var/obj/effect/hotspot/H in hotspots)
|
||||
H.process()
|
||||
@@ -200,14 +206,21 @@ turf/CanPass(atom/movable/mover, turf/target, height=1.5,air_group=0)
|
||||
T.atmos_adjacent_turfs &= ~counterdir
|
||||
|
||||
/atom/movable/proc/air_update_turf(var/command = 0)
|
||||
if(istype(loc,/turf))
|
||||
for(var/turf/T in locs) // used by double wide doors and other nonexistant multitile structures
|
||||
if(command)
|
||||
T.CalculateAdjacentTurfs()
|
||||
if(air_master)
|
||||
air_master.add_to_active(T,command)
|
||||
if(!istype(loc,/turf) && command)
|
||||
return
|
||||
for(var/turf/T in locs) // used by double wide doors and other nonexistant multitile structures
|
||||
T.air_update_turf(command)
|
||||
|
||||
/turf/proc/air_update_turf(var/command = 0)
|
||||
if(command)
|
||||
CalculateAdjacentTurfs()
|
||||
if(air_master)
|
||||
air_master.add_to_active(src,command)
|
||||
|
||||
/atom/movable/proc/move_update_air(var/turf/T)
|
||||
if(istype(T,/turf))
|
||||
T.air_update_turf(1)
|
||||
air_update_turf(1)
|
||||
|
||||
/atom/movable/proc/atmos_spawn_air(var/text, var/amount) //because a lot of people loves to copy paste awful code lets just make a easy proc to spawn your plasma fires
|
||||
var/turf/simulated/T = get_turf(src)
|
||||
|
||||
+10
-1
@@ -42,7 +42,16 @@
|
||||
|
||||
return heard
|
||||
|
||||
|
||||
/proc/alone_in_area(var/area/the_area, var/mob/must_be_alone, var/check_type = /mob/living/carbon)
|
||||
var/area/our_area = get_area_master(the_area)
|
||||
for(var/C in living_mob_list)
|
||||
if(!istype(C, check_type))
|
||||
continue
|
||||
if(C == must_be_alone)
|
||||
continue
|
||||
if(our_area == get_area_master(C))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
|
||||
//Magic constants obtained by using linear regression on right-angled triangles of sides 0<x<1, 0<y<1
|
||||
|
||||
@@ -81,8 +81,8 @@ Proc for attack log creation, because really why not
|
||||
|
||||
proc/add_logs(mob/user, mob/target, what_done, var/admin=1, var/object=null, var/addition=null)
|
||||
if(user && ismob(user))
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Has [what_done] [target ? "[target.name][target.ckey ? "([target.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition]</font>")
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Has [what_done] [target ? "[target.name][(ismob(target) && target.ckey) ? "([target.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition]</font>")
|
||||
if(target && ismob(target))
|
||||
target.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been [what_done] by [user ? "[user.name][user.ckey ? "([user.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition]</font>")
|
||||
target.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been [what_done] by [user ? "[user.name][(ismob(user) && user.ckey) ? "([user.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition]</font>")
|
||||
if(admin)
|
||||
log_attack("<font color='red'>[user ? "[user.name][(ismob(user) && user.ckey) ? "([user.ckey])" : ""]" : "NON-EXISTANT SUBJECT"] [what_done] [target ? "[target.name][(ismob(target) && target.ckey)? "([target.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition]</font>")
|
||||
@@ -9,99 +9,96 @@
|
||||
"1:2,3:4" is the square (1,3) with pixel offsets (+2, +4); slightly right and slightly above the turf grid.
|
||||
Pixel offsets are used so you don't perfectly hide the turf under them, that would be crappy.
|
||||
|
||||
In addition, the keywords NORTH, SOUTH, EAST, WEST and CENTER can be used to represent their respective
|
||||
screen borders. NORTH-1, for example, is the row just below the upper edge. Useful if you want your
|
||||
UI to scale with screen size.
|
||||
|
||||
The size of the user's screen is defined by client.view (indirectly by world.view), in our case "15x15".
|
||||
Therefore, the top right corner (except during admin shenanigans) is at "15,15"
|
||||
*/
|
||||
|
||||
//Upper left action buttons, displayed when you pick up an item that has this enabled.
|
||||
#define ui_action_slot1 "1:6,14:26"
|
||||
#define ui_action_slot2 "2:8,14:26"
|
||||
#define ui_action_slot3 "3:10,14:26"
|
||||
#define ui_action_slot4 "4:12,14:26"
|
||||
#define ui_action_slot5 "5:14,14:26"
|
||||
#define ui_action_slot1 "WEST :6, NORTH-1:26"
|
||||
#define ui_action_slot2 "WEST+1:8, NORTH-1:26"
|
||||
#define ui_action_slot3 "WEST+2:10,NORTH-1:26"
|
||||
#define ui_action_slot4 "WEST+3:12,NORTH-1:26"
|
||||
#define ui_action_slot5 "WEST+4:14,NORTH-1:26"
|
||||
|
||||
//Lower left, persistant menu
|
||||
#define ui_inventory "1:6,1:5"
|
||||
#define ui_inventory "WEST:6,SOUTH:5"
|
||||
|
||||
//Middle left indicators
|
||||
#define ui_alienplasmadisplay "14:28,8:13"
|
||||
#define ui_lingchemdisplay "1,7:15"
|
||||
#define ui_lingchemdisplay "WEST:6,CENTER-1:15"
|
||||
#define ui_lingstingdisplay "WEST:6,CENTER-3:11"
|
||||
|
||||
//Lower center, persistant menu
|
||||
#define ui_sstore1 "3:10,1:5"
|
||||
#define ui_id "4:12,1:5"
|
||||
#define ui_belt "5:14,1:5"
|
||||
#define ui_back "6:14,1:5"
|
||||
#define ui_rhand "7:16,1:5"
|
||||
#define ui_lhand "8:16,1:5"
|
||||
#define ui_equip "7:16,2:5"
|
||||
#define ui_swaphand1 "7:16,2:5"
|
||||
#define ui_swaphand2 "8:16,2:5"
|
||||
#define ui_storage1 "9:18,1:5"
|
||||
#define ui_storage2 "10:20,1:5"
|
||||
#define ui_sstore1 "CENTER-5:10,SOUTH:5"
|
||||
#define ui_id "CENTER-4:12,SOUTH:5"
|
||||
#define ui_belt "CENTER-3:14,SOUTH:5"
|
||||
#define ui_back "CENTER-2:14,SOUTH:5"
|
||||
#define ui_rhand "CENTER:-16,SOUTH:5"
|
||||
#define ui_lhand "CENTER: 16,SOUTH:5"
|
||||
#define ui_equip "CENTER:-16,SOUTH+1:5"
|
||||
#define ui_swaphand1 "CENTER:-16,SOUTH+1:5"
|
||||
#define ui_swaphand2 "CENTER: 16,SOUTH+1:5"
|
||||
#define ui_storage1 "CENTER+1:18,SOUTH:5"
|
||||
#define ui_storage2 "CENTER+2:20,SOUTH:5"
|
||||
|
||||
#define ui_inv1 "6:16,1:5" //borgs
|
||||
#define ui_inv2 "7:16,1:5" //borgs
|
||||
#define ui_inv3 "8:16,1:5" //borgs
|
||||
#define ui_borg_store "9:16,1:5" //borgs
|
||||
#define ui_inv1 "CENTER-2:16,SOUTH:5" //borgs
|
||||
#define ui_inv2 "CENTER-1 :16,SOUTH:5" //borgs
|
||||
#define ui_inv3 "CENTER :16,SOUTH:5" //borgs
|
||||
#define ui_borg_store "CENTER+1:16,SOUTH:5" //borgs
|
||||
|
||||
#define ui_monkey_mask "5:14,1:5" //monkey
|
||||
#define ui_monkey_back "6:15,1:5" //monkey
|
||||
#define ui_monkey_mask "CENTER-3:14,SOUTH:5" //monkey
|
||||
#define ui_monkey_back "CENTER-2:15,SOUTH:5" //monkey
|
||||
|
||||
#define ui_alien_storage_l "6:14,1:5"
|
||||
#define ui_alien_storage_r "9:18,1:5"
|
||||
#define ui_alien_storage_l "CENTER-2:14,SOUTH:5"//alien
|
||||
#define ui_alien_storage_r "CENTER+1:18,SOUTH:5"//alien
|
||||
|
||||
//Lower right, persistant menu
|
||||
#define ui_drop_throw "14:28,2:7"
|
||||
#define ui_pull_resist "13:26,2:7"
|
||||
#define ui_movi "13:26,1:5"
|
||||
#define ui_acti "12:24,1:5"
|
||||
#define ui_zonesel "14:28,1:5"
|
||||
#define ui_acti_alt "14:28,1:5" //alternative intent switcher for when the interface is hidden (F12)
|
||||
#define ui_drop_throw "EAST-1:28,SOUTH+1:7"
|
||||
#define ui_pull_resist "EAST-2:26,SOUTH+1:7"
|
||||
#define ui_movi "EAST-2:26,SOUTH:5"
|
||||
#define ui_acti "EAST-3:24,SOUTH:5"
|
||||
#define ui_zonesel "EAST-1:28,SOUTH:5"
|
||||
#define ui_acti_alt "EAST-1:28,SOUTH:5" //alternative intent switcher for when the interface is hidden (F12)
|
||||
|
||||
#define ui_borg_pull "12:24,2:7"
|
||||
#define ui_borg_module "13:26,2:7"
|
||||
#define ui_borg_panel "14:28,2:7"
|
||||
#define ui_borg_pull "EAST-3:24,SOUTH+1:7"
|
||||
#define ui_borg_module "EAST-2:26,SOUTH+1:7"
|
||||
#define ui_borg_panel "EAST-1:28,SOUTH+1:7"
|
||||
|
||||
//Upper-middle right (damage indicators)
|
||||
#define ui_toxin "14:28,13:27"
|
||||
#define ui_fire "14:28,12:25"
|
||||
#define ui_oxygen "14:28,11:23"
|
||||
#define ui_pressure "14:28,10:21"
|
||||
#define ui_toxin "EAST-1:28,CENTER+5:27"
|
||||
#define ui_fire "EAST-1:28,CENTER+4:25"
|
||||
#define ui_oxygen "EAST-1:28,CENTER+3:23"
|
||||
#define ui_pressure "EAST-1:28,CENTER+2:21"
|
||||
|
||||
#define ui_alien_toxin "14:28,13:25"
|
||||
#define ui_alien_fire "14:28,12:25"
|
||||
#define ui_alien_oxygen "14:28,11:25"
|
||||
#define ui_alien_toxin "EAST-1:28,CENTER+5:25"
|
||||
#define ui_alien_fire "EAST-1:28,CENTER+4:25"
|
||||
#define ui_alien_oxygen "EAST-1:28,CENTER+3:25"
|
||||
|
||||
//Middle right (status indicators)
|
||||
#define ui_nutrition "14:28,5:11"
|
||||
#define ui_temp "14:28,6:13"
|
||||
#define ui_health "14:28,7:15"
|
||||
#define ui_internal "14:28,8:17"
|
||||
//borgs
|
||||
#define ui_borg_health "14:28,6:13" //borgs have the health display where humans have the pressure damage indicator.
|
||||
#define ui_alien_health "14:28,6:13" //aliens have the health display where humans have the pressure damage indicator.
|
||||
#define ui_nutrition "EAST-1:28,CENTER-3:11"
|
||||
#define ui_temp "EAST-1:28,CENTER-2:13"
|
||||
#define ui_health "EAST-1:28,CENTER-1:15"
|
||||
#define ui_internal "EAST-1:28,CENTER:17"
|
||||
|
||||
//borgs and aliens
|
||||
#define ui_borg_health "EAST-1:28,CENTER-1:15" //borgs have the health display where humans have the pressure damage indicator.
|
||||
#define ui_alien_health "EAST-1:28,CENTER-1:15" //aliens have the health display where humans have the pressure damage indicator.
|
||||
#define ui_alienplasmadisplay "EAST-1:28,CENTER-2:15"
|
||||
|
||||
//Pop-up inventory
|
||||
#define ui_shoes "2:8,1:5"
|
||||
#define ui_shoes "WEST+1:8,SOUTH:5"
|
||||
|
||||
#define ui_iclothing "1:6,2:7"
|
||||
#define ui_oclothing "2:8,2:7"
|
||||
#define ui_gloves "3:10,2:7"
|
||||
#define ui_iclothing "WEST:6,SOUTH+1:7"
|
||||
#define ui_oclothing "WEST+1:8,SOUTH+1:7"
|
||||
#define ui_gloves "WEST+2:10,SOUTH+1:7"
|
||||
|
||||
#define ui_glasses "1:6,3:9"
|
||||
#define ui_mask "2:8,3:9"
|
||||
#define ui_ears "3:10,3:9"
|
||||
#define ui_glasses "WEST:6,SOUTH+2:9"
|
||||
#define ui_mask "WEST+1:8,SOUTH+2:9"
|
||||
#define ui_ears "WEST+2:10,SOUTH+2:9"
|
||||
|
||||
#define ui_head "2:8,4:11"
|
||||
|
||||
#define ui_hand "6:14,1:5"
|
||||
#define ui_hstore1 "5,5"
|
||||
#define ui_sleep "EAST+1, NORTH-13"
|
||||
#define ui_rest "EAST+1, NORTH-14"
|
||||
#define ui_head "WEST+1:8,SOUTH+3:11"
|
||||
|
||||
|
||||
#define ui_iarrowleft "SOUTH-1,11"
|
||||
#define ui_iarrowright "SOUTH-1,13"
|
||||
|
||||
#define ui_lingstingdisplay "1,6:15"
|
||||
|
||||
@@ -151,14 +151,14 @@
|
||||
mymob.blind.icon = 'icons/mob/screen_full.dmi'
|
||||
mymob.blind.icon_state = "blackimageoverlay"
|
||||
mymob.blind.name = " "
|
||||
mymob.blind.screen_loc = "1,1"
|
||||
mymob.blind.screen_loc = "CENTER-7,CENTER-7"
|
||||
mymob.blind.layer = 0
|
||||
|
||||
mymob.flash = new /obj/screen()
|
||||
mymob.flash.icon = 'icons/mob/screen_alien.dmi'
|
||||
mymob.flash.icon_state = "blank"
|
||||
mymob.flash.name = "flash"
|
||||
mymob.flash.screen_loc = "1,1 to 15,15"
|
||||
mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH"
|
||||
mymob.flash.layer = 17
|
||||
|
||||
mymob.zone_sel = new /obj/screen/zone_sel/alien()
|
||||
|
||||
@@ -57,14 +57,14 @@
|
||||
mymob.blind.icon = 'icons/mob/screen_full.dmi'
|
||||
mymob.blind.icon_state = "blackimageoverlay"
|
||||
mymob.blind.name = " "
|
||||
mymob.blind.screen_loc = "1,1"
|
||||
mymob.blind.screen_loc = "CENTER-7,CENTER-7"
|
||||
mymob.blind.layer = 0
|
||||
|
||||
mymob.flash = new /obj/screen()
|
||||
mymob.flash.icon = 'icons/mob/screen_alien.dmi'
|
||||
mymob.flash.icon_state = "blank"
|
||||
mymob.flash.name = "flash"
|
||||
mymob.flash.screen_loc = "1,1 to 15,15"
|
||||
mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH"
|
||||
mymob.flash.layer = 17
|
||||
|
||||
mymob.zone_sel = new /obj/screen/zone_sel/alien()
|
||||
|
||||
+103
-57
@@ -2,6 +2,12 @@
|
||||
The global hud:
|
||||
Uses the same visual objects for all players.
|
||||
*/
|
||||
|
||||
#define HUD_VERSIONS 3 //used in show_hud()
|
||||
//1 = standard hud
|
||||
//2 = reduced hud (just hands and intent switcher)
|
||||
//3 = no hud (for screenshots)
|
||||
|
||||
var/datum/global_hud/global_hud = new()
|
||||
|
||||
/datum/global_hud
|
||||
@@ -30,32 +36,32 @@ var/datum/global_hud/global_hud = new()
|
||||
//that nasty looking dither you get when you're short-sighted
|
||||
vimpaired = newlist(/obj/screen,/obj/screen,/obj/screen,/obj/screen)
|
||||
O = vimpaired[1]
|
||||
O.screen_loc = "1,1 to 5,15"
|
||||
O.screen_loc = "WEST,SOUTH to CENTER-3,NORTH" //West dither
|
||||
O = vimpaired[2]
|
||||
O.screen_loc = "5,1 to 10,5"
|
||||
O.screen_loc = "WEST,SOUTH to EAST,CENTER-3" //South dither
|
||||
O = vimpaired[3]
|
||||
O.screen_loc = "6,11 to 10,15"
|
||||
O.screen_loc = "CENTER+3,SOUTH to EAST,NORTH" //East dither
|
||||
O = vimpaired[4]
|
||||
O.screen_loc = "11,1 to 15,15"
|
||||
O.screen_loc = "WEST,CENTER+3 to EAST,NORTH" //North dither
|
||||
|
||||
//welding mask overlay black/dither
|
||||
darkMask = newlist(/obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen)
|
||||
O = darkMask[1]
|
||||
O.screen_loc = "3,3 to 5,13"
|
||||
O.screen_loc = "CENTER-5,CENTER-5 to CENTER-3,CENTER+5" //West dither
|
||||
O = darkMask[2]
|
||||
O.screen_loc = "5,3 to 10,5"
|
||||
O.screen_loc = "CENTER-5,CENTER-5 to CENTER+5,CENTER-3" //South dither
|
||||
O = darkMask[3]
|
||||
O.screen_loc = "6,11 to 10,13"
|
||||
O.screen_loc = "CENTER+3,CENTER-5 to CENTER+5,CENTER+5" //East dither
|
||||
O = darkMask[4]
|
||||
O.screen_loc = "11,3 to 13,13"
|
||||
O.screen_loc = "CENTER-5,CENTER+3 to CENTER+5,CENTER+5" //North dither
|
||||
O = darkMask[5]
|
||||
O.screen_loc = "1,1 to 15,2"
|
||||
O.screen_loc = "WEST,SOUTH to CENTER-5,NORTH" //West black
|
||||
O = darkMask[6]
|
||||
O.screen_loc = "1,3 to 2,15"
|
||||
O.screen_loc = "WEST,SOUTH to EAST,CENTER-5" //South black
|
||||
O = darkMask[7]
|
||||
O.screen_loc = "14,3 to 15,15"
|
||||
O.screen_loc = "CENTER+5,SOUTH to EAST,NORTH" //East black
|
||||
O = darkMask[8]
|
||||
O.screen_loc = "3,14 to 13,15"
|
||||
O.screen_loc = "WEST,CENTER+5 to EAST,NORTH" //North black
|
||||
|
||||
for(i = 1, i <= 4, i++)
|
||||
O = vimpaired[i]
|
||||
@@ -84,6 +90,7 @@ var/datum/global_hud/global_hud = new()
|
||||
var/mob/mymob
|
||||
|
||||
var/hud_shown = 1 //Used for the HUD toggle (F12)
|
||||
var/hud_version = 1 //Current displayed version of the HUD
|
||||
var/inventory_shown = 1 //the inventory
|
||||
var/show_intent_icons = 0
|
||||
var/hotkey_ui_hidden = 0 //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons)
|
||||
@@ -189,57 +196,99 @@ datum/hud/New(mob/owner)
|
||||
blob_hud()
|
||||
|
||||
if(istype(mymob.loc,/obj/mecha))
|
||||
hide_hud()
|
||||
show_hud(1)
|
||||
|
||||
|
||||
/datum/hud/proc/hide_hud() // hide hands is not currently used by anything but could be
|
||||
//Version denotes which style should be displayed. blank or 0 means "next version"
|
||||
/datum/hud/proc/show_hud(var/version = 0)
|
||||
if(!ismob(mymob))
|
||||
return 0
|
||||
if(!mymob.client)
|
||||
return 0
|
||||
if(hud_shown)
|
||||
hud_shown = 0
|
||||
if(adding)
|
||||
mymob.client.screen -= adding
|
||||
if(other)
|
||||
mymob.client.screen -= other
|
||||
if(hotkeybuttons)
|
||||
mymob.client.screen -= hotkeybuttons
|
||||
if(item_action_list)
|
||||
mymob.client.screen -= item_action_list
|
||||
var/display_hud_version = version
|
||||
if(!display_hud_version) //If 0 or blank, display the next hud version
|
||||
display_hud_version = hud_version + 1
|
||||
if(display_hud_version > HUD_VERSIONS) //If the requested version number is greater than the available versions, reset back to the first version
|
||||
display_hud_version = 1
|
||||
|
||||
//These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone.
|
||||
mymob.client.screen -= mymob.zone_sel //zone_sel is a mob variable for some reason.
|
||||
switch(display_hud_version)
|
||||
if(1) //Default HUD
|
||||
hud_shown = 1 //Governs behavior of other procs
|
||||
if(adding)
|
||||
mymob.client.screen += adding
|
||||
if(other && inventory_shown)
|
||||
mymob.client.screen += other
|
||||
if(hotkeybuttons && !hotkey_ui_hidden)
|
||||
mymob.client.screen += hotkeybuttons
|
||||
|
||||
//These ones are a part of 'adding', 'other' or 'hotkeybuttons' but we want them to stay
|
||||
mymob.client.screen += l_hand_hud_object //we want the hands to be visible
|
||||
mymob.client.screen += r_hand_hud_object //we want the hands to be visible
|
||||
mymob.client.screen += action_intent //we want the intent swticher visible
|
||||
action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is.
|
||||
action_intent.screen_loc = ui_acti //Restore intent selection to the original position
|
||||
mymob.client.screen += mymob.zone_sel //This one is a special snowflake
|
||||
mymob.client.screen += mymob.bodytemp //As are the rest of these...
|
||||
mymob.client.screen += mymob.fire
|
||||
mymob.client.screen += mymob.healths
|
||||
mymob.client.screen += mymob.internals
|
||||
mymob.client.screen += mymob.nutrition_icon
|
||||
mymob.client.screen += mymob.oxygen
|
||||
mymob.client.screen += mymob.pressure
|
||||
mymob.client.screen += mymob.toxin
|
||||
mymob.client.screen += lingstingdisplay
|
||||
mymob.client.screen += lingchemdisplay
|
||||
|
||||
hidden_inventory_update()
|
||||
persistant_inventory_update()
|
||||
mymob.update_action_buttons()
|
||||
hidden_inventory_update()
|
||||
persistant_inventory_update()
|
||||
mymob.update_action_buttons()
|
||||
if(2) //Reduced HUD
|
||||
hud_shown = 0 //Governs behavior of other procs
|
||||
if(adding)
|
||||
mymob.client.screen -= adding
|
||||
if(other)
|
||||
mymob.client.screen -= other
|
||||
if(hotkeybuttons)
|
||||
mymob.client.screen -= hotkeybuttons
|
||||
if(item_action_list)
|
||||
mymob.client.screen -= item_action_list
|
||||
|
||||
/datum/hud/proc/show_hud()
|
||||
if(!ismob(mymob))
|
||||
return 0
|
||||
if(!mymob.client)
|
||||
return 0
|
||||
if(!hud_shown)
|
||||
hud_shown = 1
|
||||
if(adding)
|
||||
mymob.client.screen += adding
|
||||
if(other && inventory_shown)
|
||||
mymob.client.screen += other
|
||||
if(hotkeybuttons && !hotkey_ui_hidden)
|
||||
mymob.client.screen += hotkeybuttons
|
||||
//These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone.
|
||||
mymob.client.screen -= mymob.zone_sel //zone_sel is a mob variable for some reason.
|
||||
mymob.client.screen -= lingstingdisplay
|
||||
mymob.client.screen -= lingchemdisplay
|
||||
|
||||
action_intent.screen_loc = ui_acti //Restore intent selection to the original position
|
||||
mymob.client.screen += mymob.zone_sel //This one is a special snowflake
|
||||
hidden_inventory_update()
|
||||
persistant_inventory_update()
|
||||
mymob.update_action_buttons()
|
||||
//These ones are a part of 'adding', 'other' or 'hotkeybuttons' but we want them to stay
|
||||
mymob.client.screen += l_hand_hud_object //we want the hands to be visible
|
||||
mymob.client.screen += r_hand_hud_object //we want the hands to be visible
|
||||
mymob.client.screen += action_intent //we want the intent swticher visible
|
||||
action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is.
|
||||
|
||||
hidden_inventory_update()
|
||||
persistant_inventory_update()
|
||||
mymob.update_action_buttons()
|
||||
if(3) //No HUD
|
||||
hud_shown = 0 //Governs behavior of other procs
|
||||
if(adding)
|
||||
mymob.client.screen -= adding
|
||||
if(other)
|
||||
mymob.client.screen -= other
|
||||
if(hotkeybuttons)
|
||||
mymob.client.screen -= hotkeybuttons
|
||||
if(item_action_list)
|
||||
mymob.client.screen -= item_action_list
|
||||
|
||||
//These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone.
|
||||
mymob.client.screen -= mymob.zone_sel //zone_sel is a mob variable for some reason.
|
||||
mymob.client.screen -= mymob.bodytemp
|
||||
mymob.client.screen -= mymob.fire
|
||||
mymob.client.screen -= mymob.healths
|
||||
mymob.client.screen -= mymob.internals
|
||||
mymob.client.screen -= mymob.nutrition_icon
|
||||
mymob.client.screen -= mymob.oxygen
|
||||
mymob.client.screen -= mymob.pressure
|
||||
mymob.client.screen -= mymob.toxin
|
||||
mymob.client.screen -= lingstingdisplay
|
||||
mymob.client.screen -= lingchemdisplay
|
||||
|
||||
hidden_inventory_update()
|
||||
persistant_inventory_update()
|
||||
mymob.update_action_buttons()
|
||||
hud_version = display_hud_version
|
||||
|
||||
//Triggered when F12 is pressed (Unless someone changed something in the DMF)
|
||||
/mob/verb/button_pressed_F12()
|
||||
@@ -248,10 +297,7 @@ datum/hud/New(mob/owner)
|
||||
|
||||
if(hud_used && client)
|
||||
if(ishuman(src))
|
||||
if(hud_used.hud_shown)
|
||||
hud_used.hide_hud()
|
||||
else
|
||||
hud_used.show_hud()
|
||||
hud_used.show_hud() //Shows the next hud preset
|
||||
else
|
||||
usr << "\red Inventory hiding is currently only supported for human mobs, sorry."
|
||||
else
|
||||
|
||||
@@ -292,7 +292,7 @@
|
||||
mymob.blind.icon = 'icons/mob/screen_full.dmi'
|
||||
mymob.blind.icon_state = "blackimageoverlay"
|
||||
mymob.blind.name = " "
|
||||
mymob.blind.screen_loc = "1,1"
|
||||
mymob.blind.screen_loc = "CENTER-7,CENTER-7"
|
||||
mymob.blind.mouse_opacity = 0
|
||||
mymob.blind.layer = 0
|
||||
|
||||
@@ -300,14 +300,14 @@
|
||||
mymob.damageoverlay.icon = 'icons/mob/screen_full.dmi'
|
||||
mymob.damageoverlay.icon_state = "oxydamageoverlay0"
|
||||
mymob.damageoverlay.name = "dmg"
|
||||
mymob.damageoverlay.screen_loc = "1,1"
|
||||
mymob.damageoverlay.screen_loc = "CENTER-7,CENTER-7"
|
||||
mymob.damageoverlay.mouse_opacity = 0
|
||||
mymob.damageoverlay.layer = 18.1 //The black screen overlay sets layer to 18 to display it, this one has to be just on top.
|
||||
|
||||
mymob.flash = new /obj/screen()
|
||||
mymob.flash.icon_state = "blank"
|
||||
mymob.flash.name = "flash"
|
||||
mymob.flash.screen_loc = "1,1 to 15,15"
|
||||
mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH"
|
||||
mymob.flash.layer = 17
|
||||
|
||||
mymob.zone_sel = new /obj/screen/zone_sel()
|
||||
@@ -339,7 +339,7 @@
|
||||
if(!hud_used) return
|
||||
if(!client) return
|
||||
|
||||
if(!hud_used.hud_shown) //Hud toggled to minimal
|
||||
if(hud_used.hud_shown != 1) //Hud toggled to minimal
|
||||
return
|
||||
|
||||
client.screen -= hud_used.item_action_list
|
||||
|
||||
@@ -152,14 +152,14 @@
|
||||
mymob.blind.icon = 'icons/mob/screen_full.dmi'
|
||||
mymob.blind.icon_state = "blackimageoverlay"
|
||||
mymob.blind.name = " "
|
||||
mymob.blind.screen_loc = "1,1"
|
||||
mymob.blind.screen_loc = "CENTER-7,CENTER-7"
|
||||
mymob.blind.layer = 0
|
||||
|
||||
mymob.flash = new /obj/screen()
|
||||
mymob.flash.icon = ui_style
|
||||
mymob.flash.icon_state = "blank"
|
||||
mymob.flash.name = "flash"
|
||||
mymob.flash.screen_loc = "1,1 to 15,15"
|
||||
mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH"
|
||||
mymob.flash.layer = 17
|
||||
|
||||
mymob.zone_sel = new /obj/screen/zone_sel()
|
||||
@@ -168,5 +168,13 @@
|
||||
|
||||
mymob.client.screen = null
|
||||
|
||||
using = new /obj/screen()
|
||||
using.name = "resist"
|
||||
using.icon = ui_style
|
||||
using.icon_state = "act_resist"
|
||||
using.screen_loc = ui_pull_resist
|
||||
using.layer = 19
|
||||
adding += using
|
||||
|
||||
mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.pullin, mymob.blind, mymob.flash, lingchemdisplay, lingstingdisplay) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach )
|
||||
mymob.client.screen += adding + other
|
||||
mymob.client.screen += adding + other
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
mymob.blind.icon = 'icons/mob/screen_full.dmi'
|
||||
mymob.blind.icon_state = "blackimageoverlay"
|
||||
mymob.blind.name = " "
|
||||
mymob.blind.screen_loc = "1,1"
|
||||
mymob.blind.screen_loc = "CENTER-7,CENTER-7"
|
||||
mymob.blind.layer = 0
|
||||
|
||||
/datum/hud/proc/ai_hud()
|
||||
|
||||
@@ -121,14 +121,14 @@
|
||||
mymob.blind.icon = 'icons/mob/screen_full.dmi'
|
||||
mymob.blind.icon_state = "blackimageoverlay"
|
||||
mymob.blind.name = " "
|
||||
mymob.blind.screen_loc = "1,1"
|
||||
mymob.blind.screen_loc = "CENTER-7,CENTER-7"
|
||||
mymob.blind.layer = 0
|
||||
|
||||
mymob.flash = new /obj/screen()
|
||||
mymob.flash.icon = 'icons/mob/screen_cyborg.dmi'
|
||||
mymob.flash.icon_state = "blank"
|
||||
mymob.flash.name = "flash"
|
||||
mymob.flash.screen_loc = "1,1 to 15,15"
|
||||
mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH"
|
||||
mymob.flash.layer = 17
|
||||
|
||||
mymob.zone_sel = new /obj/screen/zone_sel()
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
user.lastattacked = M
|
||||
M.lastattacker = user
|
||||
|
||||
add_logs(user, M, "attacked", src.name, "(INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])")
|
||||
add_logs(user, M, "attacked", object=src.name, addition="(INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])")
|
||||
|
||||
//spawn(1800) // this wont work right
|
||||
// M.lastattacker = null
|
||||
|
||||
@@ -158,7 +158,7 @@ datum/shuttle_controller
|
||||
captain_announce("The Emergency Shuttle has left the station. Estimate [round(timeleft()/60,1)] minutes until the shuttle docks at Central Command.")
|
||||
else if(location == TRANSIT)
|
||||
move_shuttles()
|
||||
message_admins("Shuttles have attempted to move to Centcom")
|
||||
//message_admins("Shuttles have attempted to move to Centcom")
|
||||
location = ENDGAME
|
||||
online = 0
|
||||
endtime = null
|
||||
|
||||
+347
-343
@@ -1,4 +1,3 @@
|
||||
|
||||
// reference: /client/proc/modify_variables(var/atom/O, var/param_var_name = null, var/autodetect_class = 0)
|
||||
|
||||
client
|
||||
@@ -402,56 +401,14 @@ client
|
||||
//This should all be moved over to datum/admins/Topic() or something ~Carn
|
||||
if( (usr.client != src) || !src.holder )
|
||||
return
|
||||
if(!check_rights(R_VAREDIT))
|
||||
return
|
||||
if(href_list["Vars"])
|
||||
debug_variables(locate(href_list["Vars"]))
|
||||
|
||||
//~CARN: for renaming mobs (updates their name, real_name, mind.name, their ID/PDA and datacore records).
|
||||
else if(href_list["rename"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/mob/M = locate(href_list["rename"])
|
||||
if(!istype(M))
|
||||
usr << "This can only be used on instances of type /mob"
|
||||
if(href_list["datumrefresh"])
|
||||
var/datum/DAT = locate(href_list["datumrefresh"])
|
||||
if(!istype(DAT, /datum))
|
||||
return
|
||||
|
||||
var/new_name = copytext(sanitize(input(usr,"What would you like to name this mob?","Input a name",M.real_name) as text|null),1,MAX_NAME_LEN)
|
||||
if( !new_name || !M ) return
|
||||
|
||||
message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].")
|
||||
M.fully_replace_character_name(M.real_name,new_name)
|
||||
href_list["datumrefresh"] = href_list["rename"]
|
||||
|
||||
else if(href_list["varnameedit"] && href_list["datumedit"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/D = locate(href_list["datumedit"])
|
||||
if(!istype(D,/datum) && !istype(D,/client))
|
||||
usr << "This can only be used on instances of types /client or /datum"
|
||||
return
|
||||
|
||||
modify_variables(D, href_list["varnameedit"], 1)
|
||||
|
||||
else if(href_list["varnamechange"] && href_list["datumchange"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/D = locate(href_list["datumchange"])
|
||||
if(!istype(D,/datum) && !istype(D,/client))
|
||||
usr << "This can only be used on instances of types /client or /datum"
|
||||
return
|
||||
|
||||
modify_variables(D, href_list["varnamechange"], 0)
|
||||
|
||||
else if(href_list["varnamemass"] && href_list["datummass"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/atom/A = locate(href_list["datummass"])
|
||||
if(!istype(A))
|
||||
usr << "This can only be used on instances of type /atom"
|
||||
return
|
||||
|
||||
cmd_mass_modify_object_variables(A, href_list["varnamemass"])
|
||||
src.debug_variables(DAT)
|
||||
|
||||
else if(href_list["mob_player_panel"])
|
||||
if(!check_rights(0)) return
|
||||
@@ -464,39 +421,6 @@ client
|
||||
src.holder.show_player_panel(M)
|
||||
href_list["datumrefresh"] = href_list["mob_player_panel"]
|
||||
|
||||
else if(href_list["give_spell"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/mob/M = locate(href_list["give_spell"])
|
||||
if(!istype(M))
|
||||
usr << "This can only be used on instances of type /mob"
|
||||
return
|
||||
|
||||
src.give_spell(M)
|
||||
href_list["datumrefresh"] = href_list["give_spell"]
|
||||
|
||||
else if(href_list["give_disease"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/mob/M = locate(href_list["give_disease"])
|
||||
if(!istype(M))
|
||||
usr << "This can only be used on instances of type /mob"
|
||||
return
|
||||
|
||||
src.give_disease(M)
|
||||
href_list["datumrefresh"] = href_list["give_spell"]
|
||||
|
||||
else if(href_list["ninja"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/mob/M = locate(href_list["ninja"])
|
||||
if(!istype(M))
|
||||
usr << "This can only be used on instances of type /mob"
|
||||
return
|
||||
|
||||
src.cmd_admin_ninjafy(M)
|
||||
href_list["datumrefresh"] = href_list["ninja"]
|
||||
|
||||
else if(href_list["godmode"])
|
||||
if(!check_rights(R_REJUVINATE)) return
|
||||
|
||||
@@ -508,125 +432,6 @@ client
|
||||
src.cmd_admin_godmode(M)
|
||||
href_list["datumrefresh"] = href_list["godmode"]
|
||||
|
||||
else if(href_list["gib"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/mob/M = locate(href_list["gib"])
|
||||
if(!istype(M))
|
||||
usr << "This can only be used on instances of type /mob"
|
||||
return
|
||||
|
||||
src.cmd_admin_gib(M)
|
||||
|
||||
else if(href_list["build_mode"])
|
||||
if(!check_rights(R_BUILDMODE)) return
|
||||
|
||||
var/mob/M = locate(href_list["build_mode"])
|
||||
if(!istype(M))
|
||||
usr << "This can only be used on instances of type /mob"
|
||||
return
|
||||
|
||||
togglebuildmode(M)
|
||||
href_list["datumrefresh"] = href_list["build_mode"]
|
||||
|
||||
else if(href_list["drop_everything"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/mob/M = locate(href_list["drop_everything"])
|
||||
if(!istype(M))
|
||||
usr << "This can only be used on instances of type /mob"
|
||||
return
|
||||
|
||||
if(usr.client)
|
||||
usr.client.cmd_admin_drop_everything(M)
|
||||
|
||||
else if(href_list["direct_control"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/mob/M = locate(href_list["direct_control"])
|
||||
if(!istype(M))
|
||||
usr << "This can only be used on instances of type /mob"
|
||||
return
|
||||
|
||||
if(usr.client)
|
||||
usr.client.cmd_assume_direct_control(M)
|
||||
|
||||
else if(href_list["make_skeleton"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/mob/living/carbon/human/H = locate(href_list["make_skeleton"])
|
||||
if(!istype(H))
|
||||
usr << "This can only be used on instances of type /mob/living/carbon/human"
|
||||
return
|
||||
|
||||
H.makeSkeleton()
|
||||
href_list["datumrefresh"] = href_list["make_skeleton"]
|
||||
|
||||
else if(href_list["delall"])
|
||||
if(!check_rights(R_DEBUG|R_SERVER)) return
|
||||
|
||||
var/obj/O = locate(href_list["delall"])
|
||||
if(!isobj(O))
|
||||
usr << "This can only be used on instances of type /obj"
|
||||
return
|
||||
|
||||
var/action_type = alert("Strict type ([O.type]) or type and all subtypes?",,"Strict type","Type and subtypes","Cancel")
|
||||
if(action_type == "Cancel" || !action_type)
|
||||
return
|
||||
|
||||
if(alert("Are you really sure you want to delete all objects of type [O.type]?",,"Yes","No") != "Yes")
|
||||
return
|
||||
|
||||
if(alert("Second confirmation required. Delete?",,"Yes","No") != "Yes")
|
||||
return
|
||||
|
||||
var/O_type = O.type
|
||||
switch(action_type)
|
||||
if("Strict type")
|
||||
var/i = 0
|
||||
for(var/obj/Obj in world)
|
||||
if(Obj.type == O_type)
|
||||
i++
|
||||
del(Obj)
|
||||
if(!i)
|
||||
usr << "No objects of this type exist"
|
||||
return
|
||||
log_admin("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ")
|
||||
message_admins("\blue [key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ")
|
||||
if("Type and subtypes")
|
||||
var/i = 0
|
||||
for(var/obj/Obj in world)
|
||||
if(istype(Obj,O_type))
|
||||
i++
|
||||
del(Obj)
|
||||
if(!i)
|
||||
usr << "No objects of this type exist"
|
||||
return
|
||||
log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
|
||||
message_admins("\blue [key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
|
||||
|
||||
else if(href_list["explode"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/atom/A = locate(href_list["explode"])
|
||||
if(!isobj(A) && !ismob(A) && !isturf(A))
|
||||
usr << "This can only be done to instances of type /obj, /mob and /turf"
|
||||
return
|
||||
|
||||
src.cmd_admin_explosion(A)
|
||||
href_list["datumrefresh"] = href_list["explode"]
|
||||
|
||||
else if(href_list["emp"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/atom/A = locate(href_list["emp"])
|
||||
if(!isobj(A) && !ismob(A) && !isturf(A))
|
||||
usr << "This can only be done to instances of type /obj, /mob and /turf"
|
||||
return
|
||||
|
||||
src.cmd_admin_emp(A)
|
||||
href_list["datumrefresh"] = href_list["emp"]
|
||||
|
||||
else if(href_list["mark_object"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
@@ -638,123 +443,6 @@ client
|
||||
src.holder.marked_datum = D
|
||||
href_list["datumrefresh"] = href_list["mark_object"]
|
||||
|
||||
else if(href_list["rotatedatum"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/atom/A = locate(href_list["rotatedatum"])
|
||||
if(!istype(A))
|
||||
usr << "This can only be done to instances of type /atom"
|
||||
return
|
||||
|
||||
switch(href_list["rotatedir"])
|
||||
if("right") A.dir = turn(A.dir, -45)
|
||||
if("left") A.dir = turn(A.dir, 45)
|
||||
href_list["datumrefresh"] = href_list["rotatedatum"]
|
||||
|
||||
else if(href_list["makehuman"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/mob/living/carbon/monkey/Mo = locate(href_list["makehuman"])
|
||||
if(!istype(Mo))
|
||||
usr << "This can only be done to instances of type /mob/living/carbon/monkey"
|
||||
return
|
||||
|
||||
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
|
||||
if(!Mo)
|
||||
usr << "Mob doesn't exist anymore"
|
||||
return
|
||||
holder.Topic(href, list("humanone"=href_list["makehuman"]))
|
||||
|
||||
else if(href_list["makemonkey"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/mob/living/carbon/human/H = locate(href_list["makemonkey"])
|
||||
if(!istype(H))
|
||||
usr << "This can only be done to instances of type /mob/living/carbon/human"
|
||||
return
|
||||
|
||||
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
|
||||
if(!H)
|
||||
usr << "Mob doesn't exist anymore"
|
||||
return
|
||||
holder.Topic(href, list("monkeyone"=href_list["makemonkey"]))
|
||||
|
||||
else if(href_list["makerobot"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/mob/living/carbon/human/H = locate(href_list["makerobot"])
|
||||
if(!istype(H))
|
||||
usr << "This can only be done to instances of type /mob/living/carbon/human"
|
||||
return
|
||||
|
||||
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
|
||||
if(!H)
|
||||
usr << "Mob doesn't exist anymore"
|
||||
return
|
||||
holder.Topic(href, list("makerobot"=href_list["makerobot"]))
|
||||
|
||||
else if(href_list["makealien"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/mob/living/carbon/human/H = locate(href_list["makealien"])
|
||||
if(!istype(H))
|
||||
usr << "This can only be done to instances of type /mob/living/carbon/human"
|
||||
return
|
||||
|
||||
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
|
||||
if(!H)
|
||||
usr << "Mob doesn't exist anymore"
|
||||
return
|
||||
holder.Topic(href, list("makealien"=href_list["makealien"]))
|
||||
|
||||
else if(href_list["makeslime"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/mob/living/carbon/human/H = locate(href_list["makeslime"])
|
||||
if(!istype(H))
|
||||
usr << "This can only be done to instances of type /mob/living/carbon/human"
|
||||
return
|
||||
|
||||
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
|
||||
if(!H)
|
||||
usr << "Mob doesn't exist anymore"
|
||||
return
|
||||
holder.Topic(href, list("makeslime"=href_list["makeslime"]))
|
||||
|
||||
else if(href_list["makeai"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/mob/living/carbon/human/H = locate(href_list["makeai"])
|
||||
if(!istype(H))
|
||||
usr << "This can only be done to instances of type /mob/living/carbon/human"
|
||||
return
|
||||
|
||||
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
|
||||
if(!H)
|
||||
usr << "Mob doesn't exist anymore"
|
||||
return
|
||||
holder.Topic(href, list("makeai"=href_list["makeai"]))
|
||||
|
||||
else if(href_list["setmutantrace"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/mob/living/carbon/human/H = locate(href_list["setmutantrace"])
|
||||
if(!istype(H))
|
||||
usr << "This can only be done to instances of type /mob/living/carbon/human"
|
||||
return
|
||||
|
||||
var/new_mutantrace = input("Please choose a new mutantrace","Mutantrace",null) as null|anything in list("NONE","golem","lizard","slime","plant","shadow", "fly", "skeleton")
|
||||
switch(new_mutantrace)
|
||||
if(null) return
|
||||
if("NONE") new_mutantrace = ""
|
||||
if(!H)
|
||||
usr << "Mob doesn't exist anymore"
|
||||
return
|
||||
if(H.dna)
|
||||
H.dna.mutantrace = new_mutantrace
|
||||
H.update_body()
|
||||
H.update_hair()
|
||||
|
||||
else if(href_list["regenerateicons"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
@@ -764,41 +452,357 @@ client
|
||||
return
|
||||
M.regenerate_icons()
|
||||
|
||||
else if(href_list["adjustDamage"] && href_list["mobToDamage"])
|
||||
if(!check_rights(0)) return
|
||||
//Needs +VAREDIT past this point
|
||||
|
||||
var/mob/living/L = locate(href_list["mobToDamage"])
|
||||
if(!istype(L)) return
|
||||
else if(check_rights(R_VAREDIT))
|
||||
|
||||
var/Text = href_list["adjustDamage"]
|
||||
|
||||
var/amount = input("Deal how much damage to mob? (Negative values here heal)","Adjust [Text]loss",0) as num
|
||||
//~CARN: for renaming mobs (updates their name, real_name, mind.name, their ID/PDA and datacore records).
|
||||
|
||||
if(!L)
|
||||
usr << "Mob doesn't exist anymore"
|
||||
return
|
||||
if(href_list["rename"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
switch(Text)
|
||||
if("brute") L.adjustBruteLoss(amount)
|
||||
if("fire") L.adjustFireLoss(amount)
|
||||
if("toxin") L.adjustToxLoss(amount)
|
||||
if("oxygen")L.adjustOxyLoss(amount)
|
||||
if("brain") L.adjustBrainLoss(amount)
|
||||
if("clone") L.adjustCloneLoss(amount)
|
||||
else
|
||||
usr << "You caused an error. DEBUG: Text:[Text] Mob:[L]"
|
||||
var/mob/M = locate(href_list["rename"])
|
||||
if(!istype(M))
|
||||
usr << "This can only be used on instances of type /mob"
|
||||
return
|
||||
|
||||
if(amount != 0)
|
||||
log_admin("[key_name(usr)] dealt [amount] amount of [Text] damage to [L] ")
|
||||
message_admins("\blue [key_name(usr)] dealt [amount] amount of [Text] damage to [L] ")
|
||||
href_list["datumrefresh"] = href_list["mobToDamage"]
|
||||
var/new_name = copytext(sanitize(input(usr,"What would you like to name this mob?","Input a name",M.real_name) as text|null),1,MAX_NAME_LEN)
|
||||
if( !new_name || !M ) return
|
||||
|
||||
message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].")
|
||||
M.fully_replace_character_name(M.real_name,new_name)
|
||||
href_list["datumrefresh"] = href_list["rename"]
|
||||
|
||||
else if(href_list["varnameedit"] && href_list["datumedit"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/D = locate(href_list["datumedit"])
|
||||
if(!istype(D,/datum) && !istype(D,/client))
|
||||
usr << "This can only be used on instances of types /client or /datum"
|
||||
return
|
||||
|
||||
modify_variables(D, href_list["varnameedit"], 1)
|
||||
|
||||
else if(href_list["varnamechange"] && href_list["datumchange"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/D = locate(href_list["datumchange"])
|
||||
if(!istype(D,/datum) && !istype(D,/client))
|
||||
usr << "This can only be used on instances of types /client or /datum"
|
||||
return
|
||||
|
||||
modify_variables(D, href_list["varnamechange"], 0)
|
||||
|
||||
else if(href_list["varnamemass"] && href_list["datummass"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/atom/A = locate(href_list["datummass"])
|
||||
if(!istype(A))
|
||||
usr << "This can only be used on instances of type /atom"
|
||||
return
|
||||
|
||||
cmd_mass_modify_object_variables(A, href_list["varnamemass"])
|
||||
|
||||
else if(href_list["give_spell"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/mob/M = locate(href_list["give_spell"])
|
||||
if(!istype(M))
|
||||
usr << "This can only be used on instances of type /mob"
|
||||
return
|
||||
|
||||
src.give_spell(M)
|
||||
href_list["datumrefresh"] = href_list["give_spell"]
|
||||
|
||||
else if(href_list["give_disease"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/mob/M = locate(href_list["give_disease"])
|
||||
if(!istype(M))
|
||||
usr << "This can only be used on instances of type /mob"
|
||||
return
|
||||
|
||||
src.give_disease(M)
|
||||
href_list["datumrefresh"] = href_list["give_spell"]
|
||||
|
||||
else if(href_list["ninja"])
|
||||
if(!check_rights(R_FUN)) return
|
||||
|
||||
var/mob/M = locate(href_list["ninja"])
|
||||
if(!istype(M))
|
||||
usr << "This can only be used on instances of type /mob"
|
||||
return
|
||||
|
||||
src.cmd_admin_ninjafy(M)
|
||||
href_list["datumrefresh"] = href_list["ninja"]
|
||||
|
||||
else if(href_list["gib"])
|
||||
if(!check_rights(R_FUN)) return
|
||||
|
||||
var/mob/M = locate(href_list["gib"])
|
||||
if(!istype(M))
|
||||
usr << "This can only be used on instances of type /mob"
|
||||
return
|
||||
|
||||
src.cmd_admin_gib(M)
|
||||
|
||||
else if(href_list["build_mode"])
|
||||
if(!check_rights(R_BUILDMODE)) return
|
||||
|
||||
var/mob/M = locate(href_list["build_mode"])
|
||||
if(!istype(M))
|
||||
usr << "This can only be used on instances of type /mob"
|
||||
return
|
||||
|
||||
togglebuildmode(M)
|
||||
href_list["datumrefresh"] = href_list["build_mode"]
|
||||
|
||||
else if(href_list["drop_everything"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/mob/M = locate(href_list["drop_everything"])
|
||||
if(!istype(M))
|
||||
usr << "This can only be used on instances of type /mob"
|
||||
return
|
||||
|
||||
if(usr.client)
|
||||
usr.client.cmd_admin_drop_everything(M)
|
||||
|
||||
else if(href_list["direct_control"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/mob/M = locate(href_list["direct_control"])
|
||||
if(!istype(M))
|
||||
usr << "This can only be used on instances of type /mob"
|
||||
return
|
||||
|
||||
if(usr.client)
|
||||
usr.client.cmd_assume_direct_control(M)
|
||||
|
||||
else if(href_list["make_skeleton"])
|
||||
if(!check_rights(R_FUN)) return
|
||||
|
||||
var/mob/living/carbon/human/H = locate(href_list["make_skeleton"])
|
||||
if(!istype(H))
|
||||
usr << "This can only be used on instances of type /mob/living/carbon/human"
|
||||
return
|
||||
|
||||
H.makeSkeleton()
|
||||
href_list["datumrefresh"] = href_list["make_skeleton"]
|
||||
|
||||
else if(href_list["delall"])
|
||||
if(!check_rights(R_DEBUG|R_SERVER)) return
|
||||
|
||||
var/obj/O = locate(href_list["delall"])
|
||||
if(!isobj(O))
|
||||
usr << "This can only be used on instances of type /obj"
|
||||
return
|
||||
|
||||
var/action_type = alert("Strict type ([O.type]) or type and all subtypes?",,"Strict type","Type and subtypes","Cancel")
|
||||
if(action_type == "Cancel" || !action_type)
|
||||
return
|
||||
|
||||
if(alert("Are you really sure you want to delete all objects of type [O.type]?",,"Yes","No") != "Yes")
|
||||
return
|
||||
|
||||
if(alert("Second confirmation required. Delete?",,"Yes","No") != "Yes")
|
||||
return
|
||||
|
||||
var/O_type = O.type
|
||||
switch(action_type)
|
||||
if("Strict type")
|
||||
var/i = 0
|
||||
for(var/obj/Obj in world)
|
||||
if(Obj.type == O_type)
|
||||
i++
|
||||
del(Obj)
|
||||
if(!i)
|
||||
usr << "No objects of this type exist"
|
||||
return
|
||||
log_admin("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ")
|
||||
message_admins("\blue [key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ")
|
||||
if("Type and subtypes")
|
||||
var/i = 0
|
||||
for(var/obj/Obj in world)
|
||||
if(istype(Obj,O_type))
|
||||
i++
|
||||
del(Obj)
|
||||
if(!i)
|
||||
usr << "No objects of this type exist"
|
||||
return
|
||||
log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
|
||||
message_admins("\blue [key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
|
||||
|
||||
else if(href_list["explode"])
|
||||
if(!check_rights(R_FUN)) return
|
||||
|
||||
var/atom/A = locate(href_list["explode"])
|
||||
if(!isobj(A) && !ismob(A) && !isturf(A))
|
||||
usr << "This can only be done to instances of type /obj, /mob and /turf"
|
||||
return
|
||||
|
||||
src.cmd_admin_explosion(A)
|
||||
href_list["datumrefresh"] = href_list["explode"]
|
||||
|
||||
else if(href_list["emp"])
|
||||
if(!check_rights(R_FUN)) return
|
||||
|
||||
var/atom/A = locate(href_list["emp"])
|
||||
if(!isobj(A) && !ismob(A) && !isturf(A))
|
||||
usr << "This can only be done to instances of type /obj, /mob and /turf"
|
||||
return
|
||||
|
||||
src.cmd_admin_emp(A)
|
||||
href_list["datumrefresh"] = href_list["emp"]
|
||||
|
||||
else if(href_list["rotatedatum"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/atom/A = locate(href_list["rotatedatum"])
|
||||
if(!istype(A))
|
||||
usr << "This can only be done to instances of type /atom"
|
||||
return
|
||||
|
||||
switch(href_list["rotatedir"])
|
||||
if("right") A.dir = turn(A.dir, -45)
|
||||
if("left") A.dir = turn(A.dir, 45)
|
||||
href_list["datumrefresh"] = href_list["rotatedatum"]
|
||||
|
||||
else if(href_list["makehuman"])
|
||||
if(!check_rights(R_SPAWN)) return
|
||||
|
||||
var/mob/living/carbon/monkey/Mo = locate(href_list["makehuman"])
|
||||
if(!istype(Mo))
|
||||
usr << "This can only be done to instances of type /mob/living/carbon/monkey"
|
||||
return
|
||||
|
||||
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
|
||||
if(!Mo)
|
||||
usr << "Mob doesn't exist anymore"
|
||||
return
|
||||
holder.Topic(href, list("humanone"=href_list["makehuman"]))
|
||||
|
||||
else if(href_list["makemonkey"])
|
||||
if(!check_rights(R_SPAWN)) return
|
||||
|
||||
var/mob/living/carbon/human/H = locate(href_list["makemonkey"])
|
||||
if(!istype(H))
|
||||
usr << "This can only be done to instances of type /mob/living/carbon/human"
|
||||
return
|
||||
|
||||
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
|
||||
if(!H)
|
||||
usr << "Mob doesn't exist anymore"
|
||||
return
|
||||
holder.Topic(href, list("monkeyone"=href_list["makemonkey"]))
|
||||
|
||||
else if(href_list["makerobot"])
|
||||
if(!check_rights(R_SPAWN)) return
|
||||
|
||||
var/mob/living/carbon/human/H = locate(href_list["makerobot"])
|
||||
if(!istype(H))
|
||||
usr << "This can only be done to instances of type /mob/living/carbon/human"
|
||||
return
|
||||
|
||||
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
|
||||
if(!H)
|
||||
usr << "Mob doesn't exist anymore"
|
||||
return
|
||||
holder.Topic(href, list("makerobot"=href_list["makerobot"]))
|
||||
|
||||
else if(href_list["makealien"])
|
||||
if(!check_rights(R_SPAWN)) return
|
||||
|
||||
var/mob/living/carbon/human/H = locate(href_list["makealien"])
|
||||
if(!istype(H))
|
||||
usr << "This can only be done to instances of type /mob/living/carbon/human"
|
||||
return
|
||||
|
||||
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
|
||||
if(!H)
|
||||
usr << "Mob doesn't exist anymore"
|
||||
return
|
||||
holder.Topic(href, list("makealien"=href_list["makealien"]))
|
||||
|
||||
else if(href_list["makeslime"])
|
||||
if(!check_rights(R_SPAWN)) return
|
||||
|
||||
var/mob/living/carbon/human/H = locate(href_list["makeslime"])
|
||||
if(!istype(H))
|
||||
usr << "This can only be done to instances of type /mob/living/carbon/human"
|
||||
return
|
||||
|
||||
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
|
||||
if(!H)
|
||||
usr << "Mob doesn't exist anymore"
|
||||
return
|
||||
holder.Topic(href, list("makeslime"=href_list["makeslime"]))
|
||||
|
||||
else if(href_list["makeai"])
|
||||
if(!check_rights(R_SPAWN)) return
|
||||
|
||||
var/mob/living/carbon/human/H = locate(href_list["makeai"])
|
||||
if(!istype(H))
|
||||
usr << "This can only be done to instances of type /mob/living/carbon/human"
|
||||
return
|
||||
|
||||
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
|
||||
if(!H)
|
||||
usr << "Mob doesn't exist anymore"
|
||||
return
|
||||
holder.Topic(href, list("makeai"=href_list["makeai"]))
|
||||
|
||||
else if(href_list["setmutantrace"])
|
||||
if(!check_rights(R_SPAWN)) return
|
||||
|
||||
var/mob/living/carbon/human/H = locate(href_list["setmutantrace"])
|
||||
if(!istype(H))
|
||||
usr << "This can only be done to instances of type /mob/living/carbon/human"
|
||||
return
|
||||
|
||||
var/new_mutantrace = input("Please choose a new mutantrace","Mutantrace",null) as null|anything in list("NONE","golem","lizard","slime","plant","shadow", "fly", "skeleton")
|
||||
switch(new_mutantrace)
|
||||
if(null) return
|
||||
if("NONE") new_mutantrace = ""
|
||||
if(!H)
|
||||
usr << "Mob doesn't exist anymore"
|
||||
return
|
||||
if(H.dna)
|
||||
H.dna.mutantrace = new_mutantrace
|
||||
H.update_body()
|
||||
H.update_hair()
|
||||
|
||||
else if(href_list["adjustDamage"] && href_list["mobToDamage"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/mob/living/L = locate(href_list["mobToDamage"])
|
||||
if(!istype(L)) return
|
||||
|
||||
var/Text = href_list["adjustDamage"]
|
||||
|
||||
var/amount = input("Deal how much damage to mob? (Negative values here heal)","Adjust [Text]loss",0) as num
|
||||
|
||||
if(!L)
|
||||
usr << "Mob doesn't exist anymore"
|
||||
return
|
||||
|
||||
switch(Text)
|
||||
if("brute") L.adjustBruteLoss(amount)
|
||||
if("fire") L.adjustFireLoss(amount)
|
||||
if("toxin") L.adjustToxLoss(amount)
|
||||
if("oxygen")L.adjustOxyLoss(amount)
|
||||
if("brain") L.adjustBrainLoss(amount)
|
||||
if("clone") L.adjustCloneLoss(amount)
|
||||
else
|
||||
usr << "You caused an error. DEBUG: Text:[Text] Mob:[L]"
|
||||
return
|
||||
|
||||
if(amount != 0)
|
||||
log_admin("[key_name(usr)] dealt [amount] amount of [Text] damage to [L] ")
|
||||
message_admins("\blue [key_name(usr)] dealt [amount] amount of [Text] damage to [L] ")
|
||||
href_list["datumrefresh"] = href_list["mobToDamage"]
|
||||
|
||||
if(href_list["datumrefresh"])
|
||||
var/datum/DAT = locate(href_list["datumrefresh"])
|
||||
if(!istype(DAT, /datum))
|
||||
return
|
||||
src.debug_variables(DAT)
|
||||
|
||||
return
|
||||
|
||||
|
||||
@@ -35,9 +35,24 @@ Bonus
|
||||
|
||||
/datum/symptom/damage_converter/proc/Convert(var/mob/living/M)
|
||||
|
||||
if(M.getFireLoss() > 0 || M.getBruteLoss() > 0)
|
||||
var/get_damage = rand(1, 2)
|
||||
M.adjustFireLoss(-get_damage)
|
||||
M.adjustBruteLoss(-get_damage)
|
||||
M.adjustToxLoss(get_damage)
|
||||
return 1
|
||||
var/get_damage = rand(1, 2)
|
||||
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = M
|
||||
|
||||
var/parts = H.get_damaged_organs(1,1) //1,1 because it needs inputs.
|
||||
|
||||
for(var/obj/item/organ/limb/L in parts)
|
||||
L.heal_damage(get_damage, get_damage, 0)
|
||||
|
||||
else
|
||||
if(M.getFireLoss() > 0 || M.getBruteLoss() > 0)
|
||||
M.adjustFireLoss(-get_damage)
|
||||
M.adjustBruteLoss(-get_damage)
|
||||
|
||||
M.adjustToxLoss(get_damage)
|
||||
return 1
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -39,8 +39,8 @@
|
||||
if(jobban_isbanned(affected_mob, new_form))
|
||||
affected_mob.death(1)
|
||||
return
|
||||
if(affected_mob.monkeyizing) return
|
||||
affected_mob.monkeyizing = 1
|
||||
if(affected_mob.notransform) return
|
||||
affected_mob.notransform = 1
|
||||
affected_mob.canmove = 0
|
||||
affected_mob.icon = null
|
||||
affected_mob.overlays.Cut()
|
||||
|
||||
+1
-1
@@ -783,7 +783,7 @@ datum/mind
|
||||
|
||||
else if (href_list["monkey"])
|
||||
var/mob/living/L = current
|
||||
if (L.monkeyizing)
|
||||
if (L.notransform)
|
||||
return
|
||||
switch(href_list["monkey"])
|
||||
if("healthy")
|
||||
|
||||
+20
-8
@@ -6,6 +6,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
/obj/effect/proc_holder/spell
|
||||
name = "Spell"
|
||||
desc = "A wizard spell"
|
||||
panel = "Spells"
|
||||
density = 0
|
||||
opacity = 0
|
||||
|
||||
@@ -15,14 +16,17 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
|
||||
var/charge_max = 100 //recharge time in deciseconds if charge_type = "recharge" or starting charges if charge_type = "charges"
|
||||
var/charge_counter = 0 //can only cast spells if it equals recharge, ++ each decisecond if charge_type = "recharge" or -- each cast if charge_type = "charges"
|
||||
var/still_recharging_msg = "<span class='notice'>The spell is still recharging.</span>"
|
||||
|
||||
var/holder_var_type = "bruteloss" //only used if charge_type equals to "holder_var"
|
||||
var/holder_var_amount = 20 //same. The amount adjusted with the mob's var when the spell is used
|
||||
|
||||
var/clothes_req = 1 //see if it requires clothes
|
||||
var/human_req = 0 //spell can only be cast by humans
|
||||
var/stat_allowed = 0 //see if it requires being conscious/alive, need to set to 1 for ghostpells
|
||||
var/invocation = "HURP DURP" //what is uttered when the wizard casts the spell
|
||||
var/invocation_type = "none" //can be none, whisper and shout
|
||||
var/invocation_emote_self = null
|
||||
var/invocation_type = "none" //can be none, whisper, emote and shout
|
||||
var/range = 7 //the range of the spell; outer radius for aoe spells
|
||||
var/message = "" //whatever it says to the guy affected by it
|
||||
var/selection_type = "view" //can be "range" or "view"
|
||||
@@ -56,7 +60,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
switch(charge_type)
|
||||
if("recharge")
|
||||
if(charge_counter < charge_max)
|
||||
user << "<span class='notice'>[name] is still recharging.</span>"
|
||||
user << still_recharging_msg
|
||||
return 0
|
||||
if("charges")
|
||||
if(!charge_counter)
|
||||
@@ -86,7 +90,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
H << "<span class='notice'>I don't feel strong enough without my hat.</span>"
|
||||
return 0
|
||||
else
|
||||
if(clothes_req)
|
||||
if(clothes_req || human_req)
|
||||
user << "<span class='notice'>This spell can only be casted by humans!</span>"
|
||||
return 0
|
||||
|
||||
@@ -113,10 +117,13 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
user.whisper(invocation)
|
||||
else
|
||||
user.whisper(replacetext(invocation," ","`"))
|
||||
if("emote")
|
||||
user.visible_message(invocation, invocation_emote_self) //same style as in mob/living/emote.dm
|
||||
|
||||
/obj/effect/proc_holder/spell/New()
|
||||
..()
|
||||
|
||||
still_recharging_msg = "<span class='notice'>[name] is still recharging.</span>"
|
||||
charge_counter = charge_max
|
||||
|
||||
/obj/effect/proc_holder/spell/Click()
|
||||
@@ -132,9 +139,10 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
sleep(1)
|
||||
charge_counter++
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/perform(list/targets, recharge = 1) //if recharge is started is important for the trigger spells
|
||||
/obj/effect/proc_holder/spell/proc/perform(list/targets, recharge = 1, mob/user = usr) //if recharge is started is important for the trigger spells
|
||||
before_cast(targets)
|
||||
invocation()
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>[user.real_name] ([user.ckey]) cast the spell [name].</font>")
|
||||
spawn(0)
|
||||
if(charge_type == "recharge" && recharge)
|
||||
start_recharge()
|
||||
@@ -176,11 +184,11 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
if(smoke_spread)
|
||||
if(smoke_spread == 1)
|
||||
var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
|
||||
smoke.set_up(smoke_amt, 0, location) //no idea what the 0 is
|
||||
smoke.set_up(smoke_amt, 0, location, smoke_amt == 1 ? 15 : 0) // if more than one smoke, spread it around
|
||||
smoke.start()
|
||||
else if(smoke_spread == 2)
|
||||
var/datum/effect/effect/system/bad_smoke_spread/smoke = new /datum/effect/effect/system/bad_smoke_spread()
|
||||
smoke.set_up(smoke_amt, 0, location) //no idea what the 0 is
|
||||
smoke.set_up(smoke_amt, 0, location, smoke_amt == 1 ? 15 : 0) // same here
|
||||
smoke.start()
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/cast(list/targets)
|
||||
@@ -246,7 +254,11 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
continue
|
||||
possible_targets += M
|
||||
|
||||
targets += input("Choose the target for the spell.", "Targeting") as mob in possible_targets
|
||||
//targets += input("Choose the target for the spell.", "Targeting") as mob in possible_targets
|
||||
//Adds a safety check post-input to make sure those targets are actually in range.
|
||||
var/mob/M = input("Choose the target for the spell.", "Targeting") as mob in possible_targets
|
||||
if(M in view_or_range(range, user, selection_type)) targets += M
|
||||
|
||||
else
|
||||
var/list/possible_targets = list()
|
||||
for(var/mob/living/target in view_or_range(range, user, selection_type))
|
||||
@@ -285,4 +297,4 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
|
||||
perform(targets)
|
||||
|
||||
return
|
||||
return
|
||||
|
||||
@@ -48,6 +48,9 @@
|
||||
I.max_charges = 0
|
||||
burnt_out = 1
|
||||
I.charges = I.max_charges
|
||||
if(istype(item,/obj/item/weapon/gun/magic/wand) && I.max_charges != 0)
|
||||
var/obj/item/weapon/gun/magic/W = item
|
||||
W.icon_state = initial(W.icon_state)
|
||||
charged_item = I
|
||||
break
|
||||
else if(istype(item, /obj/item/weapon/cell/))
|
||||
|
||||
@@ -14,12 +14,15 @@
|
||||
//should have format of list("emagged" = 1,"name" = "Wizard's Justicebot"), for example
|
||||
var/delay = 1//Go Go Gadget Inheritance
|
||||
|
||||
var/cast_sound = 'sound/items/welder.ogg'
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/cast(list/targets)
|
||||
|
||||
for(var/turf/T in targets)
|
||||
if(T.density && !summon_ignore_density)
|
||||
targets -= T
|
||||
playsound(src.loc, 'sound/items/welder.ogg', 50, 1)
|
||||
|
||||
playsound(src.loc, cast_sound, 50, 1)
|
||||
|
||||
if(do_after(usr,delay))
|
||||
for(var/i=0,i<summon_amt,i++)
|
||||
@@ -64,4 +67,4 @@
|
||||
summon_type = list(/obj/machinery/bot/ed209)
|
||||
summon_amt = 10
|
||||
range = 3
|
||||
newVars = list("emagged" = 1,"name" = "Wizard's Justicebot")
|
||||
newVars = list("emagged" = 2,"name" = "Wizard's Justicebot")
|
||||
@@ -83,10 +83,21 @@
|
||||
invocation_type = "none"
|
||||
range = -1
|
||||
include_user = 1
|
||||
phaseshift = 1
|
||||
jaunt_duration = 50 //in deciseconds
|
||||
centcom_cancast = 0 //Stop people from getting to centcom
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/jaunt_disappear(var/atom/movable/overlay/animation, var/mob/living/target)
|
||||
animation.icon_state = "phase_shift"
|
||||
animation.dir = target.dir
|
||||
flick("phase_shift",animation)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/jaunt_reappear(var/atom/movable/overlay/animation, var/mob/living/target)
|
||||
animation.icon_state = "phase_shift2"
|
||||
animation.dir = target.dir
|
||||
flick("phase_shift2",animation)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/jaunt_steam(var/mobloc)
|
||||
return
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser
|
||||
name = "Lesser Magic Missile"
|
||||
|
||||
@@ -11,12 +11,11 @@
|
||||
cooldown_min = 100 //50 deciseconds reduction per rank
|
||||
include_user = 1
|
||||
centcom_cancast = 0 //Prevent people from getting to centcom
|
||||
|
||||
var phaseshift = 0
|
||||
var/jaunt_duration = 50 //in deciseconds
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/cast(list/targets) //magnets, so mostly hardcoded
|
||||
for(var/mob/living/target in targets)
|
||||
target.notransform = 1 //protects the mob from being transformed (replaced) midjaunt and getting stuck in bluespace
|
||||
spawn(0)
|
||||
var/mobloc = get_turf(target.loc)
|
||||
var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt( mobloc )
|
||||
@@ -25,61 +24,46 @@
|
||||
animation.density = 0
|
||||
animation.anchored = 1
|
||||
animation.icon = 'icons/mob/mob.dmi'
|
||||
animation.icon_state = "liquify"
|
||||
animation.layer = 5
|
||||
animation.master = holder
|
||||
target.ExtinguishMob()
|
||||
if(target.buckled)
|
||||
target.buckled.unbuckle()
|
||||
if(phaseshift == 1)
|
||||
animation.dir = target.dir
|
||||
flick("phase_shift",animation)
|
||||
target.loc = holder
|
||||
sleep(jaunt_duration)
|
||||
mobloc = get_turf(target.loc)
|
||||
animation.loc = mobloc
|
||||
target.canmove = 0
|
||||
holder.reappearing = 1
|
||||
sleep(20)
|
||||
animation.dir = target.dir
|
||||
flick("phase_shift2",animation)
|
||||
sleep(5)
|
||||
if(!target.Move(mobloc))
|
||||
for(var/direction in list(1,2,4,8,5,6,9,10))
|
||||
var/turf/T = get_step(mobloc, direction)
|
||||
if(T)
|
||||
if(target.Move(T))
|
||||
break
|
||||
target.canmove = 1
|
||||
target.client.eye = target
|
||||
del(animation)
|
||||
del(holder)
|
||||
else
|
||||
flick("liquify",animation)
|
||||
target.loc = holder
|
||||
var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread()
|
||||
steam.set_up(10, 0, mobloc)
|
||||
steam.start()
|
||||
sleep(jaunt_duration)
|
||||
mobloc = get_turf(target.loc)
|
||||
animation.loc = mobloc
|
||||
steam.location = mobloc
|
||||
steam.start()
|
||||
target.canmove = 0
|
||||
holder.reappearing = 1
|
||||
sleep(20)
|
||||
flick("reappear",animation)
|
||||
sleep(5)
|
||||
if(!target.Move(mobloc))
|
||||
for(var/direction in list(1,2,4,8,5,6,9,10))
|
||||
var/turf/T = get_step(mobloc, direction)
|
||||
if(T)
|
||||
if(target.Move(T))
|
||||
break
|
||||
target.canmove = 1
|
||||
target.client.eye = target
|
||||
del(animation)
|
||||
del(holder)
|
||||
jaunt_disappear(animation, target)
|
||||
target.loc = holder
|
||||
target.notransform=0 //mob is safely inside holder now, no need for protection.
|
||||
jaunt_steam(mobloc)
|
||||
sleep(jaunt_duration)
|
||||
mobloc = get_turf(target.loc)
|
||||
animation.loc = mobloc
|
||||
jaunt_steam(mobloc)
|
||||
target.canmove = 0
|
||||
holder.reappearing = 1
|
||||
sleep(20)
|
||||
jaunt_reappear(animation, target)
|
||||
sleep(5)
|
||||
if(!target.Move(mobloc))
|
||||
for(var/direction in list(1,2,4,8,5,6,9,10))
|
||||
var/turf/T = get_step(mobloc, direction)
|
||||
if(T)
|
||||
if(target.Move(T))
|
||||
break
|
||||
target.canmove = 1
|
||||
target.client.eye = target
|
||||
del(animation)
|
||||
del(holder)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/proc/jaunt_disappear(var/atom/movable/overlay/animation, var/mob/living/target)
|
||||
animation.icon_state = "liquify"
|
||||
flick("liquify",animation)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/proc/jaunt_reappear(var/atom/movable/overlay/animation, var/mob/living/target)
|
||||
flick("reappear",animation)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/proc/jaunt_steam(var/mobloc)
|
||||
var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread()
|
||||
steam.set_up(10, 0, mobloc)
|
||||
steam.start()
|
||||
|
||||
/obj/effect/dummy/spell_jaunt
|
||||
name = "water"
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall
|
||||
name = "Invisible wall"
|
||||
desc = "The mime's performance transmutates into physical reality."
|
||||
school = "mime"
|
||||
panel = "Mime"
|
||||
summon_type = list(/obj/effect/forcefield/mime)
|
||||
invocation_type = "emote"
|
||||
invocation_emote_self = "<span class='notice'>You form a wall in front of yourself.</span>"
|
||||
summon_lifespan = 300
|
||||
charge_max = 300
|
||||
clothes_req = 0
|
||||
range = 0
|
||||
cast_sound = null
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall/Click()
|
||||
if(usr)
|
||||
invocation = "<B>[usr.real_name]</B> looks as if a wall is in front of them."
|
||||
else
|
||||
invocation_type ="none"
|
||||
..()
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/mime/speak
|
||||
name = "Speech"
|
||||
desc = "Make or break a vow of silence."
|
||||
school = "mime"
|
||||
panel = "Mime"
|
||||
clothes_req = 0
|
||||
human_req = 1
|
||||
charge_max = 3000
|
||||
range = -1
|
||||
include_user = 1
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/mime/speak/Click()
|
||||
if(!usr)
|
||||
return
|
||||
if(!ishuman(usr))
|
||||
return
|
||||
var/mob/living/carbon/human/H = usr
|
||||
if(H.miming)
|
||||
still_recharging_msg = "<span class='notice'>You can't break your vow of silence that fast!</span>"
|
||||
else
|
||||
still_recharging_msg = "<span class='notice'>You'll have to wait before you can give your vow of silence again.</span>"
|
||||
..()
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/mime/speak/cast(list/targets)
|
||||
for(var/mob/living/carbon/human/H in targets)
|
||||
H.miming=!H.miming
|
||||
if(H.miming)
|
||||
H << "<span class='notice'>You make a vow of silence.</span>"
|
||||
else
|
||||
H << "<span class='notice'>You break your vow of silence.</span>"
|
||||
@@ -10,7 +10,6 @@
|
||||
range = 1
|
||||
cooldown_min = 200 //100 deciseconds reduction per rank
|
||||
var/list/protected_roles = list("Wizard","Changeling","Cultist") //which roles are immune to the spell
|
||||
var/list/compatible_mobs = list(/mob/living/carbon/human,/mob/living/carbon/monkey) //which types of mobs are affected by the spell. NOTE: change at your own risk
|
||||
var/base_spell_loss_chance = 20 //base probability of the wizard losing a spell in the process
|
||||
var/spell_loss_chance_modifier = 7 //amount of probability of losing a spell added per spell (mind_transfer included)
|
||||
var/spell_loss_amount = 1 //the maximum amount of spells possible to lose during a single transfer
|
||||
@@ -38,12 +37,8 @@ Also, you never added distance checking after target is selected. I've went ahea
|
||||
user << "They are too far away!"
|
||||
return
|
||||
|
||||
if(!(target.type in compatible_mobs))
|
||||
user << "Their mind isn't compatible with yours."
|
||||
return
|
||||
|
||||
if(target.stat == DEAD)
|
||||
user << "You didn't study necromancy back at the Space Wizard Federation academy."
|
||||
user << "You don't particularly want to be dead."
|
||||
return
|
||||
|
||||
if(!target.key || !target.mind)
|
||||
|
||||
@@ -31,4 +31,5 @@
|
||||
if(!picked || !isturf(picked))
|
||||
return
|
||||
|
||||
target.loc = picked
|
||||
if(!target.Move(picked))
|
||||
target.loc = picked
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
|
||||
|
||||
smoke_spread = 1
|
||||
smoke_amt = 10
|
||||
smoke_amt = 1
|
||||
|
||||
inner_tele_radius = 0
|
||||
outer_tele_radius = 6
|
||||
|
||||
@@ -684,11 +684,13 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/critter/corgi
|
||||
containername = "corgi crate"
|
||||
|
||||
/datum/supply_packs/organic/cat
|
||||
name = "Cat crate"
|
||||
cost = 40
|
||||
cost = 50 //Cats are worth as much as corgis.
|
||||
containertype = /obj/structure/closet/critter/cat
|
||||
containername = "cat crate"
|
||||
|
||||
/datum/supply_packs/organic/pug
|
||||
name = "Pug crate"
|
||||
cost = 50
|
||||
|
||||
@@ -377,6 +377,7 @@ var/list/uplink_items = list()
|
||||
You can wrench the bomb down to prevent removal. The crew may attempt to defuse the bomb."
|
||||
item = /obj/item/device/sbeacondrop/bomb
|
||||
cost = 5
|
||||
excludefrom = list(/datum/game_mode/traitor/double_agents)
|
||||
|
||||
/datum/uplink_item/device_tools/syndicate_detonator
|
||||
name = "Syndicate Detonator"
|
||||
@@ -384,6 +385,7 @@ var/list/uplink_items = list()
|
||||
Useful for when speed matters or you wish to synchronize multiple bomb blasts. Be sure to stand clear of the blast radius before using the detonator."
|
||||
item = /obj/item/device/syndicatedetonator
|
||||
cost = 1
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/device_tools/teleporter
|
||||
name = "Teleporter Circuit Board"
|
||||
|
||||
@@ -11,8 +11,6 @@ var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if
|
||||
|
||||
/datum/wires/syndicatebomb/UpdatePulsed(var/index)
|
||||
var/obj/machinery/syndicatebomb/P = holder
|
||||
if(P.degutted)
|
||||
return
|
||||
switch(index)
|
||||
if(WIRE_BOOM)
|
||||
if (P.active)
|
||||
@@ -49,8 +47,6 @@ var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if
|
||||
|
||||
/datum/wires/syndicatebomb/UpdateCut(var/index, var/mended)
|
||||
var/obj/machinery/syndicatebomb/P = holder
|
||||
if(P.degutted)
|
||||
return
|
||||
switch(index)
|
||||
if(WIRE_EXPLODE)
|
||||
if(!mended)
|
||||
|
||||
@@ -75,7 +75,6 @@
|
||||
throwforce = 0.0
|
||||
throw_speed = 1
|
||||
throw_range = 20
|
||||
flags = FPRINT | TABLEPASS
|
||||
afterattack(atom/target as mob|obj|turf|area, mob/user as mob)
|
||||
user.drop_item()
|
||||
src.throw_at(target, throw_range, throw_speed)
|
||||
|
||||
+17
-55
@@ -3,7 +3,6 @@
|
||||
desc = "Should anything ever go wrong..."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "red_phone"
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
force = 3.0
|
||||
throwforce = 2.0
|
||||
throw_speed = 1
|
||||
@@ -22,7 +21,6 @@
|
||||
anchored = 0.0
|
||||
var/matter = 0
|
||||
var/mode = 1
|
||||
flags = TABLEPASS
|
||||
w_class = 3.0
|
||||
|
||||
/obj/item/weapon/spacecash
|
||||
@@ -145,7 +143,6 @@
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "cane"
|
||||
item_state = "stick"
|
||||
flags = FPRINT | TABLEPASS| CONDUCT
|
||||
force = 5.0
|
||||
throwforce = 7.0
|
||||
w_class = 2.0
|
||||
@@ -182,7 +179,7 @@
|
||||
gender = PLURAL
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "handcuff"
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
flags = CONDUCT
|
||||
throwforce = 0
|
||||
w_class = 3.0
|
||||
origin_tech = "materials=1"
|
||||
@@ -241,7 +238,6 @@
|
||||
throw_speed = 1
|
||||
throw_range = 5
|
||||
w_class = 2.0
|
||||
flags = FPRINT | TABLEPASS
|
||||
attack_verb = list("warned", "cautioned", "smashed")
|
||||
|
||||
/obj/item/weapon/caution/cone
|
||||
@@ -254,48 +250,9 @@
|
||||
desc = "Parts of a rack."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "rack_parts"
|
||||
flags = FPRINT | TABLEPASS| CONDUCT
|
||||
flags = CONDUCT
|
||||
m_amt = 3750
|
||||
|
||||
/*/obj/item/weapon/syndicate_uplink
|
||||
name = "station bounced radio"
|
||||
desc = "Remain silent about this..."
|
||||
icon = 'icons/obj/radio.dmi'
|
||||
icon_state = "radio"
|
||||
var/temp = null
|
||||
var/uses = 10.0
|
||||
var/selfdestruct = 0.0
|
||||
var/traitor_frequency = 0.0
|
||||
var/mob/currentUser = null
|
||||
var/obj/item/device/radio/origradio = null
|
||||
flags = FPRINT | TABLEPASS | CONDUCT | ONBELT
|
||||
w_class = 2.0
|
||||
item_state = "radio"
|
||||
throw_speed = 4
|
||||
throw_range = 20
|
||||
m_amt = 100
|
||||
origin_tech = "magnets=2;syndicate=3"*/
|
||||
|
||||
/obj/item/weapon/SWF_uplink
|
||||
name = "station-bounced radio"
|
||||
desc = "used to comunicate it appears."
|
||||
icon = 'icons/obj/radio.dmi'
|
||||
icon_state = "radio"
|
||||
var/temp = null
|
||||
var/uses = 4.0
|
||||
var/selfdestruct = 0.0
|
||||
var/traitor_frequency = 0.0
|
||||
var/obj/item/device/radio/origradio = null
|
||||
flags = FPRINT | TABLEPASS| CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
item_state = "radio"
|
||||
throwforce = 5
|
||||
w_class = 2.0
|
||||
throw_speed = 4
|
||||
throw_range = 20
|
||||
m_amt = 100
|
||||
origin_tech = "magnets=1"
|
||||
|
||||
/obj/item/weapon/staff
|
||||
name = "wizards staff"
|
||||
desc = "Apparently a staff used by the wizard."
|
||||
@@ -306,7 +263,7 @@
|
||||
throw_speed = 1
|
||||
throw_range = 5
|
||||
w_class = 2.0
|
||||
flags = FPRINT | TABLEPASS | NOSHIELD
|
||||
flags = NOSHIELD
|
||||
attack_verb = list("bludgeoned", "whacked", "disciplined")
|
||||
|
||||
/obj/item/weapon/staff/broom
|
||||
@@ -326,7 +283,7 @@
|
||||
throw_speed = 1
|
||||
throw_range = 5
|
||||
w_class = 2.0
|
||||
flags = FPRINT | TABLEPASS | NOSHIELD
|
||||
flags = NOSHIELD
|
||||
|
||||
/obj/item/weapon/table_parts
|
||||
name = "table parts"
|
||||
@@ -335,7 +292,7 @@
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "table_parts"
|
||||
m_amt = 3750
|
||||
flags = FPRINT | TABLEPASS| CONDUCT
|
||||
flags = CONDUCT
|
||||
attack_verb = list("slammed", "bashed", "battered", "bludgeoned", "thrashed", "whacked")
|
||||
|
||||
/obj/item/weapon/table_parts/reinforced
|
||||
@@ -344,7 +301,7 @@
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "reinf_tableparts"
|
||||
m_amt = 7500
|
||||
flags = FPRINT | TABLEPASS| CONDUCT
|
||||
flags = CONDUCT
|
||||
|
||||
/obj/item/weapon/table_parts/wood
|
||||
name = "wooden table parts"
|
||||
@@ -352,13 +309,18 @@
|
||||
icon_state = "wood_tableparts"
|
||||
flags = null
|
||||
|
||||
/obj/item/weapon/table_parts/wood/poker
|
||||
name = "poker table parts"
|
||||
desc = "Keep away from fire, and keep near seedy dealers."
|
||||
icon_state = "poker_tableparts"
|
||||
flags = null
|
||||
|
||||
/obj/item/weapon/module
|
||||
icon = 'icons/obj/module.dmi'
|
||||
icon_state = "std_module"
|
||||
w_class = 2.0
|
||||
item_state = "electronic"
|
||||
flags = FPRINT|TABLEPASS|CONDUCT
|
||||
var/mtype = 1 // 1=electronic 2=hardware
|
||||
flags = CONDUCT
|
||||
|
||||
/obj/item/weapon/module/card_reader
|
||||
name = "card reader module"
|
||||
@@ -390,7 +352,7 @@
|
||||
desc = "Meat that appears...strange..."
|
||||
icon = 'icons/obj/food.dmi'
|
||||
icon_state = "meat"
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
flags = CONDUCT
|
||||
w_class = 1.0
|
||||
origin_tech = "biotech=2"
|
||||
|
||||
@@ -399,7 +361,7 @@
|
||||
desc = "A very sharp axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "hatchet"
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
flags = CONDUCT
|
||||
force = 12.0
|
||||
w_class = 1.0
|
||||
throwforce = 15.0
|
||||
@@ -422,7 +384,7 @@
|
||||
throw_speed = 1
|
||||
throw_range = 3
|
||||
w_class = 4.0
|
||||
flags = FPRINT | TABLEPASS | NOSHIELD
|
||||
flags = CONDUCT | NOSHIELD
|
||||
slot_flags = SLOT_BACK
|
||||
origin_tech = "materials=2;combat=2"
|
||||
attack_verb = list("chopped", "sliced", "cut", "reaped")
|
||||
@@ -445,7 +407,7 @@
|
||||
w_class = 1
|
||||
throwforce = 2
|
||||
var/cigarcount = 6
|
||||
flags = ONBELT | TABLEPASS */
|
||||
*/
|
||||
|
||||
/obj/item/weapon/pai_cable
|
||||
desc = "A flexible coated cable with a universal jack on one end."
|
||||
|
||||
+1
-3
@@ -1,7 +1,7 @@
|
||||
/atom
|
||||
layer = 2
|
||||
var/level = 2
|
||||
var/flags = FPRINT
|
||||
var/flags = null
|
||||
var/list/fingerprints
|
||||
var/list/fingerprintshidden
|
||||
var/fingerprintslast = null
|
||||
@@ -249,8 +249,6 @@ var/list/blood_splatter_icons = list()
|
||||
return 0
|
||||
if(!check_dna_integrity(M)) //check dna is valid and create/setup if necessary
|
||||
return 0 //no dna!
|
||||
if(!(flags & FPRINT))
|
||||
return 0
|
||||
if(!istype(blood_DNA, /list)) //if our list of DNA doesn't exist yet (or isn't a list) initialise it.
|
||||
blood_DNA = list()
|
||||
return
|
||||
|
||||
+29
-74
@@ -70,89 +70,44 @@
|
||||
|
||||
src.throwing = 1
|
||||
|
||||
if(usr)
|
||||
if(HULK in usr.mutations)
|
||||
src.throwing = 2 // really strong throw!
|
||||
|
||||
var/dist_x = abs(target.x - src.x)
|
||||
var/dist_y = abs(target.y - src.y)
|
||||
|
||||
var/dx
|
||||
if (target.x > src.x)
|
||||
dx = EAST
|
||||
else
|
||||
dx = WEST
|
||||
|
||||
var/dy
|
||||
if (target.y > src.y)
|
||||
dy = NORTH
|
||||
else
|
||||
dy = SOUTH
|
||||
var/dx = (target.x > src.x) ? EAST : WEST
|
||||
var/dy = (target.y > src.y) ? NORTH : 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
|
||||
|
||||
var/tdist_x = dist_x;
|
||||
var/tdist_y = dist_y;
|
||||
var/tdx = dx;
|
||||
var/tdy = dy;
|
||||
|
||||
if(dist_x <= dist_y)
|
||||
tdist_x = dist_y;
|
||||
tdist_y = dist_x;
|
||||
tdx = dy;
|
||||
tdy = dx;
|
||||
|
||||
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)
|
||||
hit_check()
|
||||
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()
|
||||
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.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()
|
||||
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()
|
||||
error -= dist_x
|
||||
dist_travelled++
|
||||
dist_since_sleep++
|
||||
if(dist_since_sleep >= speed)
|
||||
dist_since_sleep = 0
|
||||
sleep(1)
|
||||
var/error = tdist_x/2 - tdist_y
|
||||
while(target && (((((dist_x > dist_y) && ((src.x < target.x && dx == EAST) || (src.x > target.x && dx == WEST))) || ((dist_x <= dist_y) && ((src.y < target.y && dy == NORTH) || (src.y > target.y && dy == SOUTH))) || (src.x > target.x && dx == WEST)) && dist_travelled < range) || (a && a.has_gravity == 0) || istype(src.loc, /turf/space)))
|
||||
// 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(!src.throwing) break
|
||||
if(!istype(src.loc, /turf)) break
|
||||
|
||||
a = get_area(src.loc)
|
||||
var/atom/step = get_step(src, (error < 0) ? tdy : tdx)
|
||||
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()
|
||||
error += (error < 0) ? tdist_x : -tdist_y;
|
||||
dist_travelled++
|
||||
dist_since_sleep++
|
||||
if(dist_since_sleep >= speed)
|
||||
dist_since_sleep = 0
|
||||
sleep(1)
|
||||
|
||||
a = get_area(src.loc)
|
||||
|
||||
//done throwing, either because it hit something or it finished moving
|
||||
src.throwing = 0
|
||||
|
||||
@@ -110,10 +110,15 @@ var/list/radiochannels = list(
|
||||
"Service" = 1349,
|
||||
)
|
||||
//depenging helpers
|
||||
var/list/DEPT_FREQS = list(1351,1355,1357,1213,1441,1347,1349)
|
||||
var/const/SEC_FREQ = 1359 //security, colored cyan in chat window
|
||||
var/const/SYND_FREQ = 1213 //nuke op frequency, coloured dark brown in chat window
|
||||
var/const/SUPP_FREQ = 1347 //supply, coloured light brown in chat window
|
||||
var/const/SERV_FREQ = 1349 //service, coloured green in chat window
|
||||
var/const/SCI_FREQ = 1351 //science, coloured plum in chat window
|
||||
var/const/COMM_FREQ = 1353 //command, colored gold in chat window
|
||||
var/const/SYND_FREQ = 1213
|
||||
var/const/MED_FREQ = 1355 //medical, coloured blue in chat window
|
||||
var/const/ENG_FREQ = 1357 //engineering, coloured orange in chat window
|
||||
var/const/SEC_FREQ = 1359 //security, coloured red in chat window
|
||||
var/const/DSQUAD_FREQ = 1441 //death squad frequency, coloured grey in chat window
|
||||
|
||||
#define TRANSMISSION_WIRE 0
|
||||
#define TRANSMISSION_RADIO 1
|
||||
|
||||
+25
-10
@@ -35,7 +35,7 @@
|
||||
var/mob/living/carbon/human/H = character
|
||||
L[DNA_HAIR_STYLE_BLOCK] = construct_block(hair_styles_list.Find(H.hair_style), hair_styles_list.len)
|
||||
L[DNA_HAIR_COLOR_BLOCK] = sanitize_hexcolor(H.hair_color)
|
||||
L[DNA_FACIAL_HAIR_STYLE_BLOCK] = construct_block(hair_styles_list.Find(H.facial_hair_style), facial_hair_styles_list.len)
|
||||
L[DNA_FACIAL_HAIR_STYLE_BLOCK] = construct_block(facial_hair_styles_list.Find(H.facial_hair_style), facial_hair_styles_list.len)
|
||||
L[DNA_FACIAL_HAIR_COLOR_BLOCK] = sanitize_hexcolor(H.facial_hair_color)
|
||||
L[DNA_SKIN_TONE_BLOCK] = construct_block(skin_tones.Find(H.skin_tone), skin_tones.len)
|
||||
L[DNA_EYE_COLOR_BLOCK] = sanitize_hexcolor(H.eye_color)
|
||||
@@ -336,6 +336,9 @@
|
||||
use_power = 1
|
||||
idle_power_usage = 50
|
||||
active_power_usage = 300
|
||||
var/damage_coeff
|
||||
var/scan_level
|
||||
var/precision_coeff
|
||||
|
||||
/obj/machinery/dna_scannernew/New()
|
||||
..()
|
||||
@@ -347,8 +350,20 @@
|
||||
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
|
||||
component_parts += new /obj/item/weapon/cable_coil(null, 1)
|
||||
component_parts += new /obj/item/weapon/cable_coil(null, 1)
|
||||
RefreshParts()
|
||||
|
||||
|
||||
/obj/machinery/dna_scannernew/RefreshParts()
|
||||
scan_level = 0
|
||||
damage_coeff = 0
|
||||
precision_coeff = 0
|
||||
for(var/obj/item/weapon/stock_parts/scanning_module/P in component_parts)
|
||||
scan_level += P.rating
|
||||
for(var/obj/item/weapon/stock_parts/manipulator/P in component_parts)
|
||||
precision_coeff = P.rating
|
||||
for(var/obj/item/weapon/stock_parts/micro_laser/P in component_parts)
|
||||
damage_coeff = P.rating
|
||||
|
||||
/obj/machinery/dna_scannernew/proc/toggle_open(mob/user=usr)
|
||||
if(!user)
|
||||
return
|
||||
@@ -582,7 +597,7 @@
|
||||
if(connected)
|
||||
if(connected.occupant) //set occupant_status message
|
||||
viable_occupant = connected.occupant
|
||||
if(check_dna_integrity(viable_occupant) && !(NOCLONE in viable_occupant.mutations)) //occupent is viable for dna modification
|
||||
if(check_dna_integrity(viable_occupant) && (!(NOCLONE in viable_occupant.mutations) || (connected.scan_level == 3))) //occupent is viable for dna modification
|
||||
occupant_status += "[viable_occupant.name] => "
|
||||
switch(viable_occupant.stat)
|
||||
if(CONSCIOUS) occupant_status += "<span class='good'>Conscious</span>"
|
||||
@@ -624,7 +639,7 @@
|
||||
var/stddev = radstrength*RADIATION_STRENGTH_MULTIPLIER
|
||||
status += "<div class='line'><div class='statusLabel'>Output Level:</div><div class='statusValue'>[radstrength]</div></div>"
|
||||
status += "<div class='line'><div class='statusLabel'> \> Mutation:</div><div class='statusValue'>(-[stddev] to +[stddev] = 68%) (-[2*stddev] to +[2*stddev] = 95%)</div></div>"
|
||||
stddev = RADIATION_ACCURACY_MULTIPLIER/radduration
|
||||
stddev = RADIATION_ACCURACY_MULTIPLIER/(radduration + (connected.precision_coeff ** 2))
|
||||
var/chance_to_hit
|
||||
switch(stddev) //hardcoded values from a z-table for a normal distribution
|
||||
if(0 to 0.25) chance_to_hit = ">95%"
|
||||
@@ -828,9 +843,9 @@
|
||||
if(num && viable_occupant)
|
||||
num = Clamp(num, 1, NUMBER_OF_BUFFERS)
|
||||
var/list/buffer_slot = buffer[num]
|
||||
if(istype(buffer_slot))
|
||||
viable_occupant.radiation += rand(15,40)
|
||||
switch(href_list["text"])
|
||||
if(istype(buffer_slot)) //15 and 40 are just magic numbers that were here before so i didnt touch them, they are initial boundaries of damage
|
||||
viable_occupant.radiation += rand(15/(connected.damage_coeff ** 2),40/(connected.damage_coeff ** 2)) //Each laser level reduces damage by lvl^2, so no effect on 1 lvl, 4 times less damage on 2 and 9 times less damage on 3
|
||||
switch(href_list["text"]) //Numbers are this high because other way upgrading laser is just not worth the hassle, and i cant think of anything better to inmrove
|
||||
if("se")
|
||||
if(buffer_slot["SE"])
|
||||
viable_occupant.dna.struc_enzymes = buffer_slot["SE"]
|
||||
@@ -899,13 +914,13 @@
|
||||
current_screen = "mainmenu"
|
||||
|
||||
if(viable_occupant && connected && connected.occupant==viable_occupant)
|
||||
viable_occupant.radiation += RADIATION_IRRADIATION_MULTIPLIER*radduration*radstrength
|
||||
switch(href_list["task"])
|
||||
viable_occupant.radiation += (RADIATION_IRRADIATION_MULTIPLIER*radduration*radstrength)/(connected.damage_coeff ** 2) //Read comment in "transferbuffer" section above for explanation
|
||||
switch(href_list["task"]) //Same thing as there but values are even lower, on best part they are about 0.0*, effectively no damage
|
||||
if("pulseui")
|
||||
var/len = length(viable_occupant.dna.uni_identity)
|
||||
num = Wrap(num, 1, len+1)
|
||||
num = randomize_radiation_accuracy(num, radduration, len)
|
||||
|
||||
num = randomize_radiation_accuracy(num, radduration + (connected.precision_coeff ** 2), len) //Each manipulator level above 1 makes randomization as accurate as selected time + manipulator lvl^2
|
||||
//Value is this high for the same reason as with laser - not worth the hassle of upgrading if the bonus is low
|
||||
var/block = round((num-1)/DNA_BLOCK_SIZE)+1
|
||||
var/subblock = num - block*DNA_BLOCK_SIZE
|
||||
last_change = "UI #[block]-[subblock]; "
|
||||
|
||||
@@ -102,7 +102,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
|
||||
|
||||
var/datum/objective/absorb/absorb_objective = new
|
||||
absorb_objective.owner = changeling
|
||||
absorb_objective.gen_amount_goal(5, 7)
|
||||
absorb_objective.gen_amount_goal(6, 8)
|
||||
changeling.objectives += absorb_objective
|
||||
|
||||
var/datum/objective/assassinate/kill_objective = new
|
||||
@@ -131,7 +131,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
|
||||
|
||||
/datum/game_mode/proc/greet_changeling(var/datum/mind/changeling, var/you_are=1)
|
||||
if (you_are)
|
||||
changeling.current << "<b>\red You are a changeling!</b>"
|
||||
changeling.current << "<b>\red You are a changeling! You have absorbed and taken the form of a human.</b>"
|
||||
changeling.current << "<b>\red Use say \":g message\" to communicate with your fellow changelings.</b>"
|
||||
changeling.current << "<b>You must complete the following tasks:</b>"
|
||||
|
||||
@@ -219,7 +219,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
|
||||
/datum/changeling //stores changeling powers, changeling recharge thingie, changeling absorbed DNA and changeling ID (for changeling hivemind)
|
||||
var/list/absorbed_dna = list()
|
||||
var/dna_max = 4 //How many extra DNA strands the changeling can store for transformation.
|
||||
var/absorbedcount = 0
|
||||
var/absorbedcount = 1 //We would require at least 1 sample of compatible DNA to have taken on the form of a human.
|
||||
var/chem_charges = 20
|
||||
var/chem_storage = 50
|
||||
var/chem_recharge_rate = 0.5
|
||||
|
||||
@@ -558,6 +558,7 @@ var/list/datum/dna/hivemind_bank = list()
|
||||
src << "<span class='notice'>We stealthly sting [C.name].</span>"
|
||||
if(C.mind && C.mind.changeling)
|
||||
C << "<span class='warning'>You feel a tiny prick.</span>"
|
||||
add_logs(src, C, "unsuccessfully stung")
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
@@ -581,9 +582,9 @@ var/list/datum/dna/hivemind_bank = list()
|
||||
set_sting(/mob/living/carbon/proc/sting_effect_trasnform, "sting_transform", D)
|
||||
|
||||
/mob/living/carbon/proc/sting_effect_trasnform(mob/living/carbon/T)
|
||||
add_logs(src, T, "stung", "transformation sting", "new identity is [src.mind.changeling.chosen_dna.real_name]")
|
||||
if(!sting_can_reach(T, 40))
|
||||
return 0
|
||||
add_logs(src, T, "stung", object="transformation sting", addition="new identity is [src.mind.changeling.chosen_dna.real_name]")
|
||||
if((HUSK in T.mutations) || !check_dna_integrity(T))
|
||||
src << "<span class='warning'>Our sting appears ineffective against its DNA.</span>"
|
||||
return 0
|
||||
@@ -603,9 +604,9 @@ var/list/datum/dna/hivemind_bank = list()
|
||||
set_sting(/mob/living/carbon/proc/sting_effect_extract, "sting_extract")
|
||||
|
||||
/mob/living/carbon/proc/sting_effect_extract(mob/living/carbon/T)
|
||||
add_logs(src, T, "stung", "extraction sting")
|
||||
if(!sting_can_reach(T, 25))
|
||||
return 0
|
||||
add_logs(src, T, "stung", object="extraction sting")
|
||||
if(src.mind.changeling.can_absorb_dna(T, usr))
|
||||
src.mind.changeling.absorb_dna(T, usr)
|
||||
else//If the sting fails, give the guy most of his chems back.
|
||||
@@ -622,9 +623,9 @@ var/list/datum/dna/hivemind_bank = list()
|
||||
set_sting(/mob/living/carbon/proc/sting_effect_mute, "sting_mute")
|
||||
|
||||
/mob/living/carbon/proc/sting_effect_mute(mob/living/carbon/T)
|
||||
add_logs(src, T, "stung", "mute sting")
|
||||
if(!sting_can_reach(T, 20))
|
||||
return 0
|
||||
add_logs(src, T, "stung", object="mute sting")
|
||||
T.silent += 30
|
||||
feedback_add_details("changeling_powers","MS")
|
||||
return 1
|
||||
@@ -637,9 +638,9 @@ var/list/datum/dna/hivemind_bank = list()
|
||||
set_sting(/mob/living/carbon/proc/sting_effect_blind, "sting_blind")
|
||||
|
||||
/mob/living/carbon/proc/sting_effect_blind(mob/living/carbon/T)
|
||||
add_logs(src, T, "stung", "blind sting")
|
||||
if(!sting_can_reach(T, 25))
|
||||
return 0
|
||||
add_logs(src, T, "stung", object="blind sting")
|
||||
T << "<span class='danger'>Your eyes burn horrifically!</span>"
|
||||
T.disabilities |= NEARSIGHTED
|
||||
T.eye_blind = 20
|
||||
@@ -655,9 +656,9 @@ var/list/datum/dna/hivemind_bank = list()
|
||||
set_sting(/mob/living/carbon/proc/sting_effect_lsd, "sting_lsd")
|
||||
|
||||
/mob/living/carbon/proc/sting_effect_lsd(mob/living/carbon/T)
|
||||
add_logs(src, T, "stung", "LSD sting")
|
||||
if(!sting_can_reach(T, 5))
|
||||
return 0
|
||||
add_logs(src, T, "stung", object="LSD sting")
|
||||
spawn(rand(300,600))
|
||||
if(T) T.hallucination += 400
|
||||
feedback_add_details("changeling_powers","HS")
|
||||
@@ -671,9 +672,9 @@ var/list/datum/dna/hivemind_bank = list()
|
||||
set_sting(/mob/living/carbon/proc/sting_effect_cryo, "sting_cryo")
|
||||
|
||||
/mob/living/carbon/proc/sting_effect_cryo(mob/living/carbon/T)
|
||||
add_logs(src, T, "stung", "cryo sting")
|
||||
if(!sting_can_reach(T, 15))
|
||||
return 0
|
||||
add_logs(src, T, "stung", object="cryo sting")
|
||||
if(T.reagents)
|
||||
T.reagents.add_reagent("frostoil", 30)
|
||||
T.reagents.add_reagent("ice", 30)
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
desc = "An arcane weapon wielded by the followers of Nar-Sie"
|
||||
icon_state = "cultblade"
|
||||
item_state = "cultblade"
|
||||
flags = FPRINT | TABLEPASS
|
||||
flags = CONDUCT
|
||||
w_class = 4
|
||||
force = 30
|
||||
throwforce = 10
|
||||
@@ -34,7 +34,7 @@
|
||||
icon_state = "culthood"
|
||||
desc = "A hood worn by the followers of Nar-Sie."
|
||||
flags_inv = HIDEFACE
|
||||
flags = FPRINT|TABLEPASS|HEADCOVERSEYES
|
||||
flags = HEADCOVERSEYES
|
||||
armor = list(melee = 30, bullet = 10, laser = 5,energy = 5, bomb = 0, bio = 0, rad = 0)
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT
|
||||
@@ -55,7 +55,6 @@
|
||||
desc = "A set of armored robes worn by the followers of Nar-Sie"
|
||||
icon_state = "cultrobes"
|
||||
item_state = "cultrobes"
|
||||
flags = FPRINT | TABLEPASS
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
|
||||
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0)
|
||||
@@ -71,7 +70,7 @@
|
||||
item_state = "magus"
|
||||
desc = "A helm worn by the followers of Nar-Sie."
|
||||
flags_inv = HIDEFACE
|
||||
flags = FPRINT|TABLEPASS|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR
|
||||
flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR
|
||||
armor = list(melee = 30, bullet = 30, laser = 30,energy = 20, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/suit/magusred
|
||||
@@ -79,7 +78,6 @@
|
||||
desc = "A set of armored robes worn by the followers of Nar-Sie"
|
||||
icon_state = "magusred"
|
||||
item_state = "magusred"
|
||||
flags = FPRINT | TABLEPASS
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
|
||||
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0)
|
||||
|
||||
@@ -306,7 +306,6 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
|
||||
throw_speed = 1
|
||||
throw_range = 5
|
||||
w_class = 2.0
|
||||
flags = FPRINT | TABLEPASS
|
||||
var/notedat = ""
|
||||
var/tomedat = ""
|
||||
var/list/words = list("ire" = "ire", "ego" = "ego", "nahlizet" = "nahlizet", "certum" = "certum", "veri" = "veri", "jatkaa" = "jatkaa", "balaq" = "balaq", "mgar" = "mgar", "karazet" = "karazet", "geeri" = "geeri")
|
||||
|
||||
@@ -288,7 +288,7 @@ var/list/sacrificed = list()
|
||||
return fizzle()
|
||||
|
||||
for(var/obj/item/organ/limb/affecting in corpse_to_raise.organs)
|
||||
affecting.heal_damage(1000, 1000)
|
||||
affecting.heal_damage(1000, 1000, 0)
|
||||
corpse_to_raise.setToxLoss(0)
|
||||
corpse_to_raise.setOxyLoss(0)
|
||||
corpse_to_raise.SetParalysis(0)
|
||||
|
||||
@@ -133,7 +133,8 @@
|
||||
var/turf/T = get_turf(M)
|
||||
if(!T || T.z != src.z)
|
||||
continue
|
||||
shake_camera(M, 3, get_dist(M.loc, src.loc) > 20 ? 1 : 3)
|
||||
var/dist = get_dist(M.loc, src.loc)
|
||||
shake_camera(M, dist > 20 ? 3 : 5, dist > 20 ? 1 : 3)
|
||||
M.playsound_local(src.loc, 'sound/effects/meteorimpact.ogg', 50, 1, get_rand_frequency(), 10)
|
||||
explosion(src.loc, 0, 1, 2, 3, 0)
|
||||
|
||||
|
||||
@@ -14,7 +14,6 @@ var/bomb_set
|
||||
var/yes_code = 0.0
|
||||
var/safety = 1.0
|
||||
var/obj/item/weapon/disk/nuclear/auth = null
|
||||
flags = FPRINT
|
||||
use_power = 0
|
||||
|
||||
/obj/machinery/nuclearbomb/New()
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "pinpointer"
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "pinoff"
|
||||
flags = FPRINT | TABLEPASS| CONDUCT
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
w_class = 2.0
|
||||
item_state = "electronic"
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
throw_range = 5
|
||||
w_class = 1.0
|
||||
var/used = 0
|
||||
flags = FPRINT | TABLEPASS
|
||||
|
||||
|
||||
/obj/item/weapon/contract/attack_self(mob/user as mob)
|
||||
@@ -116,7 +115,6 @@
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "render"
|
||||
item_state = "render"
|
||||
flags = FPRINT | TABLEPASS
|
||||
force = 15
|
||||
throwforce = 10
|
||||
w_class = 3
|
||||
@@ -196,7 +194,6 @@
|
||||
throwforce = 15
|
||||
damtype = BURN
|
||||
force = 15
|
||||
flags = FPRINT | TABLEPASS
|
||||
hitsound = 'sound/items/welder2.ogg'
|
||||
|
||||
/obj/item/weapon/scrying/attack_self(mob/user as mob)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
if(H.stat == 2 || !(H.client)) continue
|
||||
if(H.mind)
|
||||
if(H.mind.special_role == "Wizard" || H.mind.special_role == "apprentice") continue
|
||||
if(prob(25))
|
||||
if(prob(25) && !(H.mind in ticker.mode.traitors))
|
||||
ticker.mode.traitors += H.mind
|
||||
H.mind.special_role = "traitor"
|
||||
var/datum/objective/survive/survive = new
|
||||
@@ -20,7 +20,7 @@
|
||||
H << "<B>Objective #[obj_count]</B>: [OBJ.explanation_text]"
|
||||
obj_count++
|
||||
var/randomizeguns = pick("taser","egun","laser","revolver","detective","smg","nuclear","deagle","gyrojet","pulse","silenced","cannon","doublebarrel","shotgun","combatshotgun","mateba","smg","uzi","crossbow","saw")
|
||||
var/randomizemagic = pick("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge","wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffchange", "staffanimation", "staffhealing", "armor", "scrying")
|
||||
var/randomizemagic = pick("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge","wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffchange", "staffhealing", "armor", "scrying")
|
||||
if(!summon_type)
|
||||
switch (randomizeguns)
|
||||
if("taser")
|
||||
@@ -96,8 +96,6 @@
|
||||
new /obj/item/weapon/gun/magic/wand/door(get_turf(H))
|
||||
if("staffchange")
|
||||
new /obj/item/weapon/gun/magic/staff/change(get_turf(H))
|
||||
if("staffanimation")
|
||||
new /obj/item/weapon/gun/magic/staff/animate(get_turf(H))
|
||||
if("staffhealing")
|
||||
new /obj/item/weapon/gun/magic/staff/healing(get_turf(H))
|
||||
if("armor")
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
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 artefacts power."
|
||||
w_class = 1.0
|
||||
flags = FPRINT | TABLEPASS
|
||||
slot_flags = SLOT_BELT
|
||||
origin_tech = "bluespace=4;materials=4"
|
||||
var/imprinted = "empty"
|
||||
@@ -81,7 +80,6 @@
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "construct"
|
||||
desc = "A wicked machine used by those skilled in magical arts. It is inactive"
|
||||
flags = FPRINT | TABLEPASS
|
||||
|
||||
/obj/structure/constructshell/attackby(obj/item/O as obj, mob/user as mob)
|
||||
if(istype(O, /obj/item/device/soulstone))
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
throw_speed = 1
|
||||
throw_range = 5
|
||||
w_class = 1.0
|
||||
flags = FPRINT | TABLEPASS
|
||||
var/uses = 5
|
||||
var/temp = null
|
||||
var/max_uses = 5
|
||||
@@ -253,7 +252,7 @@
|
||||
max_uses--
|
||||
temp = "You have cast summon guns."
|
||||
if("summonmagic")
|
||||
feedback_add_details("wizard_spell_learned","SM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
|
||||
feedback_add_details("wizard_spell_learned","SU") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
|
||||
H.rightandwrong(1)
|
||||
max_uses--
|
||||
temp = "You have cast summon magic."
|
||||
@@ -334,6 +333,7 @@
|
||||
else
|
||||
user.spell_list += S
|
||||
user <<"<span class='notice'>you rapidly read through the arcane book. Suddenly you realize you understand [spellname]!</span>"
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='orange'>[user.real_name] ([user.ckey]) learned the spell [spellname] ([S]).</font>")
|
||||
onlearned(user)
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/proc/recoil(mob/user as mob)
|
||||
@@ -387,6 +387,7 @@
|
||||
spellname = "mindswap"
|
||||
icon_state ="bookmindswap"
|
||||
desc = "This book's cover is pristine, though its pages look ragged and torn."
|
||||
var/mob/stored_swap = null //Used in used book recoils to store an identity for mindswaps
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/mindswap/onlearned()
|
||||
spellname = pick("fireball","smoke","blind","forcewall","knock","horses","charge")
|
||||
@@ -396,8 +397,45 @@
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/mindswap/recoil(mob/user as mob)
|
||||
..()
|
||||
user <<"<span class='warning'>You suddenly don't feel like yourself!</span>"
|
||||
wabbajack(user)
|
||||
if(stored_swap in dead_mob_list)
|
||||
stored_swap = null
|
||||
if(!stored_swap)
|
||||
stored_swap = user
|
||||
user <<"<span class='warning'>For a moment you feel like you don't even know who you are anymore.</span>"
|
||||
return
|
||||
if(stored_swap == user)
|
||||
user <<"<span class='notice'>You stare at the book some more, but there doesn't seem to be anything else to learn...</span>"
|
||||
return
|
||||
|
||||
if(user.mind.special_verbs.len)
|
||||
for(var/V in user.mind.special_verbs)
|
||||
user.verbs -= V
|
||||
|
||||
if(stored_swap.mind.special_verbs.len)
|
||||
for(var/V in stored_swap.mind.special_verbs)
|
||||
stored_swap.verbs -= V
|
||||
|
||||
var/mob/dead/observer/ghost = stored_swap.ghostize(0)
|
||||
ghost.spell_list = stored_swap.spell_list
|
||||
|
||||
user.mind.transfer_to(stored_swap)
|
||||
stored_swap.spell_list = user.spell_list
|
||||
|
||||
if(stored_swap.mind.special_verbs.len)
|
||||
for(var/V in user.mind.special_verbs)
|
||||
user.verbs += V
|
||||
|
||||
ghost.mind.transfer_to(user)
|
||||
user.key = ghost.key
|
||||
user.spell_list = ghost.spell_list
|
||||
|
||||
if(user.mind.special_verbs.len)
|
||||
for(var/V in user.mind.special_verbs)
|
||||
user.verbs += V
|
||||
|
||||
stored_swap <<"<span class='warning'>You're suddenly somewhere else... and someone else?!</span>"
|
||||
user <<"<span class='warning'>Suddenly you're staring at [src] again... where are you, who are you?!</span>"
|
||||
stored_swap = null
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/forcewall
|
||||
spell = /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall
|
||||
|
||||
@@ -242,10 +242,8 @@
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
|
||||
H.equip_to_slot_or_del(new /obj/item/toy/crayon/mime(H), slot_in_backpack)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(H), slot_in_backpack)
|
||||
H.verbs += /client/proc/mimespeak
|
||||
H.verbs += /client/proc/mimewall
|
||||
H.mind.special_verbs += /client/proc/mimespeak
|
||||
H.mind.special_verbs += /client/proc/mimewall
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall(H)
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/targeted/mime/speak(H)
|
||||
H.miming = 1
|
||||
H.rename_self("mime")
|
||||
return 1
|
||||
@@ -268,6 +266,7 @@
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(H), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_srv(H), slot_ears)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/pda/janitor(H), slot_belt)
|
||||
return 1
|
||||
|
||||
@@ -303,6 +303,14 @@
|
||||
/obj/machinery/sleeper/container_resist()
|
||||
eject()
|
||||
|
||||
/obj/machinery/sleeper/relaymove(var/mob/user)
|
||||
..()
|
||||
eject()
|
||||
|
||||
/obj/machinery/sleeper/Del()
|
||||
go_out()
|
||||
..()
|
||||
|
||||
/obj/machinery/sleeper/proc/eject()
|
||||
go_out()
|
||||
add_fingerprint(usr)
|
||||
|
||||
@@ -874,7 +874,7 @@ Code shamelessly copied from apc_frame
|
||||
desc = "Used for building Air Alarms"
|
||||
icon = 'icons/obj/monitors.dmi'
|
||||
icon_state = "alarm_bitem"
|
||||
flags = FPRINT | TABLEPASS| CONDUCT
|
||||
flags = CONDUCT
|
||||
|
||||
/obj/item/alarm_frame/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if (istype(W, /obj/item/weapon/wrench))
|
||||
@@ -986,9 +986,9 @@ FIRE ALARM
|
||||
if (istype(W, /obj/item/device/multitool))
|
||||
src.detecting = !( src.detecting )
|
||||
if (src.detecting)
|
||||
user.visible_message("\red [user] has reconnected [src]'s detecting unit!", "You have reconnected [src]'s detecting unit.")
|
||||
user.visible_message("<span class='warning'>[user] has reconnected [src]'s detecting unit!</span>", "<span class='warning'>You have reconnected [src]'s detecting unit.</span>")
|
||||
else
|
||||
user.visible_message("\red [user] has disconnected [src]'s detecting unit!", "You have disconnected [src]'s detecting unit.")
|
||||
user.visible_message("<span class='warning'>[user] has disconnected [src]'s detecting unit!</span>", "<span class='warning'>You have disconnected [src]'s detecting unit.</span>")
|
||||
|
||||
else if (istype(W, /obj/item/weapon/wirecutters))
|
||||
buildstage = 1
|
||||
@@ -996,13 +996,13 @@ FIRE ALARM
|
||||
var/obj/item/weapon/cable_coil/coil = new /obj/item/weapon/cable_coil()
|
||||
coil.amount = 5
|
||||
coil.loc = user.loc
|
||||
user << "You cut the wires from \the [src]"
|
||||
user << "<span class='notice'>You cut the wires from \the [src]</span>"
|
||||
update_icon()
|
||||
if(1)
|
||||
if(istype(W, /obj/item/weapon/cable_coil))
|
||||
var/obj/item/weapon/cable_coil/coil = W
|
||||
if(coil.amount < 5)
|
||||
user << "You need more cable for this!"
|
||||
user << "<span class='warning'>You need more cable for this!</span>"
|
||||
return
|
||||
|
||||
coil.amount -= 5
|
||||
@@ -1010,26 +1010,26 @@ FIRE ALARM
|
||||
del(coil)
|
||||
|
||||
buildstage = 2
|
||||
user << "You wire \the [src]!"
|
||||
user << "<span class='notice'>You wire \the [src]!</span>"
|
||||
update_icon()
|
||||
|
||||
else if(istype(W, /obj/item/weapon/crowbar))
|
||||
user << "You pry out the circuit!"
|
||||
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
|
||||
spawn(20)
|
||||
var/obj/item/weapon/firealarm_electronics/circuit = new /obj/item/weapon/firealarm_electronics()
|
||||
circuit.loc = user.loc
|
||||
buildstage = 0
|
||||
update_icon()
|
||||
if(buildstage == 1)
|
||||
user << "<span class='notice'>You pry out the circuit!</span>"
|
||||
new /obj/item/weapon/firealarm_electronics(user.loc)
|
||||
buildstage = 0
|
||||
update_icon()
|
||||
if(0)
|
||||
if(istype(W, /obj/item/weapon/firealarm_electronics))
|
||||
user << "You insert the circuit!"
|
||||
user << "<span class='notice'>You insert the circuit!</span>"
|
||||
del(W)
|
||||
buildstage = 1
|
||||
update_icon()
|
||||
|
||||
else if(istype(W, /obj/item/weapon/wrench))
|
||||
user << "You remove the fire alarm assembly from the wall!"
|
||||
user.visible_message("<span class='warning'>[user] removes the fire alarm assembly from the wall!</span>", "<span class='warning'>You remove the fire alarm assembly from the wall!</span>")
|
||||
var/obj/item/firealarm_frame/frame = new /obj/item/firealarm_frame()
|
||||
frame.loc = user.loc
|
||||
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
|
||||
@@ -1208,28 +1208,9 @@ Code shamelessly copied from apc_frame
|
||||
desc = "Used for building Fire Alarms"
|
||||
icon = 'icons/obj/monitors.dmi'
|
||||
icon_state = "fire_bitem"
|
||||
flags = FPRINT | TABLEPASS| CONDUCT
|
||||
flags = CONDUCT
|
||||
|
||||
|
||||
/*
|
||||
* Party button
|
||||
*/
|
||||
|
||||
/obj/machinery/partyalarm
|
||||
name = "\improper PARTY BUTTON"
|
||||
desc = "Cuban Pete is in the house!"
|
||||
icon = 'icons/obj/monitors.dmi'
|
||||
icon_state = "fire0"
|
||||
var/detecting = 1.0
|
||||
var/working = 1.0
|
||||
var/time = 10.0
|
||||
var/timing = 0.0
|
||||
var/lockdownbyai = 0
|
||||
anchored = 1.0
|
||||
use_power = 1
|
||||
idle_power_usage = 2
|
||||
active_power_usage = 6
|
||||
|
||||
/obj/item/firealarm_frame/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if (istype(W, /obj/item/weapon/wrench))
|
||||
new /obj/item/stack/sheet/metal( get_turf(src.loc), 2 )
|
||||
@@ -1262,16 +1243,22 @@ Code shamelessly copied from apc_frame
|
||||
|
||||
del(src)
|
||||
|
||||
/obj/machinery/partyalarm/attack_paw(mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
/obj/machinery/partyalarm/attack_hand(mob/user as mob)
|
||||
/*
|
||||
* Party button
|
||||
*/
|
||||
|
||||
/obj/machinery/firealarm/partyalarm
|
||||
name = "\improper PARTY BUTTON"
|
||||
desc = "Cuban Pete is in the house!"
|
||||
|
||||
/obj/machinery/firealarm/partyalarm/attack_hand(mob/user as mob)
|
||||
if(user.stat || stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
|
||||
user.set_machine(src)
|
||||
var/area/A = src.loc
|
||||
var/d1
|
||||
var/d2
|
||||
var/dat
|
||||
if (istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai))
|
||||
A = A.loc
|
||||
|
||||
@@ -1279,76 +1266,40 @@ Code shamelessly copied from apc_frame
|
||||
d1 = text("<A href='?src=\ref[];reset=1'>No Party :(</A>", src)
|
||||
else
|
||||
d1 = text("<A href='?src=\ref[];alarm=1'>PARTY!!!</A>", src)
|
||||
if (src.timing)
|
||||
d2 = text("<A href='?src=\ref[];time=0'>Stop Time Lock</A>", src)
|
||||
else
|
||||
d2 = text("<A href='?src=\ref[];time=1'>Initiate Time Lock</A>", src)
|
||||
var/second = src.time % 60
|
||||
var/minute = (src.time - second) / 60
|
||||
var/dat = text("<HTML><HEAD></HEAD><BODY><TT><B>Party Button</B> []\n<HR>\nTimer System: []<br />\nTime Left: [][] <A href='?src=\ref[];tp=-30'>-</A> <A href='?src=\ref[];tp=-1'>-</A> <A href='?src=\ref[];tp=1'>+</A> <A href='?src=\ref[];tp=30'>+</A>\n</TT></BODY></HTML>", d1, d2, (minute ? text("[]:", minute) : null), second, src, src, src, src)
|
||||
user << browse(dat, "window=partyalarm")
|
||||
onclose(user, "partyalarm")
|
||||
dat = text("<HTML><HEAD></HEAD><BODY><TT><B>Party Button</B> []</BODY></HTML>", d1)
|
||||
|
||||
else
|
||||
A = A.loc
|
||||
if (A.fire)
|
||||
d1 = text("<A href='?src=\ref[];reset=1'>[]</A>", src, stars("No Party :("))
|
||||
else
|
||||
d1 = text("<A href='?src=\ref[];alarm=1'>[]</A>", src, stars("PARTY!!!"))
|
||||
if (src.timing)
|
||||
d2 = text("<A href='?src=\ref[];time=0'>[]</A>", src, stars("Stop Time Lock"))
|
||||
else
|
||||
d2 = text("<A href='?src=\ref[];time=1'>[]</A>", src, stars("Initiate Time Lock"))
|
||||
var/second = src.time % 60
|
||||
var/minute = (src.time - second) / 60
|
||||
var/dat = text("<HTML><HEAD></HEAD><BODY><TT><B>[]</B> []\n<HR>\nTimer System: []<br />\nTime Left: [][] <A href='?src=\ref[];tp=-30'>-</A> <A href='?src=\ref[];tp=-1'>-</A> <A href='?src=\ref[];tp=1'>+</A> <A href='?src=\ref[];tp=30'>+</A>\n</TT></BODY></HTML>", stars("Party Button"), d1, d2, (minute ? text("[]:", minute) : null), second, src, src, src, src)
|
||||
user << browse(dat, "window=partyalarm")
|
||||
onclose(user, "partyalarm")
|
||||
dat = text("<HTML><HEAD></HEAD><BODY><TT><B>[]</B> []", stars("Party Button"), d1)
|
||||
|
||||
var/datum/browser/popup = new(user, "firealarm", "Party Alarm")
|
||||
popup.set_content(dat)
|
||||
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
|
||||
popup.open()
|
||||
return
|
||||
|
||||
/obj/machinery/partyalarm/proc/reset()
|
||||
/obj/machinery/firealarm/partyalarm/reset()
|
||||
if (!( src.working ))
|
||||
return
|
||||
var/area/A = src.loc
|
||||
A = A.loc
|
||||
if (!( istype(A, /area) ))
|
||||
return
|
||||
A.partyreset()
|
||||
for(var/area/RA in A.related)
|
||||
RA.partyreset()
|
||||
return
|
||||
|
||||
/obj/machinery/partyalarm/proc/alarm()
|
||||
/obj/machinery/firealarm/partyalarm/alarm()
|
||||
if (!( src.working ))
|
||||
return
|
||||
var/area/A = src.loc
|
||||
A = A.loc
|
||||
if (!( istype(A, /area) ))
|
||||
return
|
||||
A.partyalert()
|
||||
return
|
||||
|
||||
/obj/machinery/partyalarm/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
if (usr.stat || stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai)))
|
||||
usr.set_machine(src)
|
||||
if (href_list["reset"])
|
||||
src.reset()
|
||||
else
|
||||
if (href_list["alarm"])
|
||||
src.alarm()
|
||||
else
|
||||
if (href_list["time"])
|
||||
src.timing = text2num(href_list["time"])
|
||||
else
|
||||
if (href_list["tp"])
|
||||
var/tp = text2num(href_list["tp"])
|
||||
src.time += tp
|
||||
src.time = min(max(round(src.time), 0), 120)
|
||||
src.updateUsrDialog()
|
||||
|
||||
src.add_fingerprint(usr)
|
||||
else
|
||||
usr << browse(null, "window=partyalarm")
|
||||
return
|
||||
return
|
||||
for(var/area/RA in A.related)
|
||||
RA.partyalert()
|
||||
return
|
||||
@@ -4,7 +4,6 @@
|
||||
icon_state = "yellow"
|
||||
density = 1
|
||||
var/health = 100.0
|
||||
flags = FPRINT | CONDUCT
|
||||
|
||||
var/valve_open = 0
|
||||
var/release_pressure = ONE_ATMOSPHERE
|
||||
@@ -264,14 +263,14 @@ Release Pressure: <A href='?src=\ref[src];pressure_adj=-1000'>-</A> <A href='?sr
|
||||
if(href_list["toggle"])
|
||||
if (valve_open)
|
||||
if (holding)
|
||||
release_log += "Valve was <b>closed</b> by [usr], stopping the transfer into the [holding]<br>"
|
||||
release_log += "Valve was <b>closed</b> by [usr] ([usr.ckey]), stopping the transfer into the [holding]<br>"
|
||||
else
|
||||
release_log += "Valve was <b>closed</b> by [usr], stopping the transfer into the <font color='red'><b>air</b></font><br>"
|
||||
release_log += "Valve was <b>closed</b> by [usr] ([usr.ckey]), stopping the transfer into the <font color='red'><b>air</b></font><br>"
|
||||
else
|
||||
if (holding)
|
||||
release_log += "Valve was <b>opened</b> by [usr], starting the transfer into the [holding]<br>"
|
||||
release_log += "Valve was <b>opened</b> by [usr] ([usr.ckey]), starting the transfer into the [holding]<br>"
|
||||
else
|
||||
release_log += "Valve was <b>opened</b> by [usr], starting the transfer into the <font color='red'><b>air</b></font><br>"
|
||||
release_log += "Valve was <b>opened</b> by [usr] ([usr.ckey]), starting the transfer into the <font color='red'><b>air</b></font><br>"
|
||||
valve_open = !valve_open
|
||||
|
||||
if (href_list["remove_tank"])
|
||||
|
||||
@@ -89,6 +89,7 @@ var/global/list/autolathe_recipes_hidden = list( \
|
||||
idle_power_usage = 10
|
||||
active_power_usage = 100
|
||||
var/busy = 0
|
||||
var/prod_coeff
|
||||
|
||||
proc
|
||||
wires_win(mob/user as mob)
|
||||
@@ -104,6 +105,7 @@ var/global/list/autolathe_recipes_hidden = list( \
|
||||
onclose(user, "autolathe_hack")
|
||||
|
||||
regular_win(mob/user as mob)
|
||||
var/coeff = 2 ** prod_coeff
|
||||
var/dat as text
|
||||
dat = text("<B>Metal Amount:</B> [src.m_amount] cm<sup>3</sup> (MAX: [max_m_amount])<BR>\n<FONT color=blue><B>Glass Amount:</B></FONT> [src.g_amount] cm<sup>3</sup> (MAX: [max_g_amount])<HR>")
|
||||
var/list/objs = list()
|
||||
@@ -111,12 +113,13 @@ var/global/list/autolathe_recipes_hidden = list( \
|
||||
if (src.hacked)
|
||||
objs += src.LL
|
||||
for(var/obj/t in objs)
|
||||
var/title = "[t.name] ([t.m_amt] m /[t.g_amt] g)"
|
||||
if (m_amount<t.m_amt || g_amount<t.g_amt)
|
||||
dat += title + "<br>"
|
||||
continue
|
||||
dat += "<A href='?src=\ref[src];make=\ref[t]'>[title]</A>"
|
||||
if (istype(t, /obj/item/stack))
|
||||
var/title = "[t.name] ([t.m_amt] m /[t.g_amt] g)"
|
||||
if (m_amount<t.m_amt || g_amount<t.g_amt)
|
||||
dat += title + "<br>"
|
||||
continue
|
||||
dat += "<A href='?src=\ref[src];make=\ref[t]'>[title]</A>"
|
||||
|
||||
var/obj/item/stack/S = t
|
||||
var/max_multiplier = min(S.max_amount, S.m_amt?round(m_amount/S.m_amt):INFINITY, S.g_amt?round(g_amount/S.g_amt):INFINITY)
|
||||
if (max_multiplier>1)
|
||||
@@ -127,6 +130,12 @@ var/global/list/autolathe_recipes_hidden = list( \
|
||||
dat += " <A href='?src=\ref[src];make=\ref[t];multiplier=[25]'>x[25]</A>"
|
||||
if (max_multiplier>1)
|
||||
dat += " <A href='?src=\ref[src];make=\ref[t];multiplier=[max_multiplier]'>x[max_multiplier]</A>"
|
||||
else
|
||||
var/title = "[t.name] ([t.m_amt/coeff] m /[t.g_amt/coeff] g)"
|
||||
if (m_amount<t.m_amt/coeff || g_amount<t.g_amt/coeff)
|
||||
dat += title + "<br>"
|
||||
continue
|
||||
dat += "<A href='?src=\ref[src];make=\ref[t]'>[title]</A>"
|
||||
dat += "<br>"
|
||||
user << browse("<HTML><HEAD><TITLE>Autolathe Control Panel</TITLE></HEAD><BODY><TT>[dat]</TT></BODY></HTML>", "window=autolathe_regular")
|
||||
onclose(user, "autolathe_regular")
|
||||
@@ -250,6 +259,7 @@ var/global/list/autolathe_recipes_hidden = list( \
|
||||
src.add_fingerprint(usr)
|
||||
if (!busy)
|
||||
if(href_list["make"])
|
||||
var/coeff = 2 ** prod_coeff
|
||||
var/turf/T = get_step(src.loc, get_dir(src,usr))
|
||||
var/obj/template = locate(href_list["make"])
|
||||
var/multiplier = text2num(href_list["multiplier"])
|
||||
@@ -260,21 +270,27 @@ var/global/list/autolathe_recipes_hidden = list( \
|
||||
use_power(power)
|
||||
icon_state = "autolathe"
|
||||
flick("autolathe_n",src)
|
||||
spawn(16)
|
||||
spawn(16/coeff)
|
||||
use_power(power)
|
||||
spawn(16)
|
||||
spawn(16/coeff)
|
||||
use_power(power)
|
||||
spawn(16)
|
||||
src.m_amount -= template.m_amt*multiplier
|
||||
src.g_amount -= template.g_amt*multiplier
|
||||
spawn(16/coeff)
|
||||
if(template.type == /obj/item/stack)
|
||||
src.m_amount -= template.m_amt*multiplier
|
||||
src.g_amount -= template.g_amt*multiplier
|
||||
var/obj/new_item = new template.type(T)
|
||||
var/obj/item/stack/S = new_item
|
||||
S.amount = multiplier
|
||||
else
|
||||
src.m_amount -= template.m_amt/coeff
|
||||
src.g_amount -= template.g_amt/coeff
|
||||
var/obj/new_item = new template.type(T)
|
||||
new_item.m_amt /= coeff
|
||||
new_item.g_amt /= coeff
|
||||
if(src.m_amount < 0)
|
||||
src.m_amount = 0
|
||||
if(src.g_amount < 0)
|
||||
src.g_amount = 0
|
||||
var/obj/new_item = new template.type(T)
|
||||
if (multiplier>1)
|
||||
var/obj/item/stack/S = new_item
|
||||
S.amount = multiplier
|
||||
busy = 0
|
||||
src.updateUsrDialog()
|
||||
if(href_list["act"])
|
||||
@@ -319,21 +335,24 @@ var/global/list/autolathe_recipes_hidden = list( \
|
||||
RefreshParts()
|
||||
..()
|
||||
var/tot_rating = 0
|
||||
prod_coeff = 0
|
||||
for(var/obj/item/weapon/stock_parts/matter_bin/MB in component_parts)
|
||||
tot_rating += MB.rating
|
||||
tot_rating *= 25000
|
||||
max_m_amount = tot_rating * 2
|
||||
max_g_amount = tot_rating
|
||||
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
|
||||
prod_coeff += M.rating - 1
|
||||
|
||||
New()
|
||||
..()
|
||||
component_parts = list()
|
||||
component_parts += new /obj/item/weapon/circuitboard/autolathe(src)
|
||||
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
|
||||
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
|
||||
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
|
||||
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
|
||||
component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
|
||||
component_parts += new /obj/item/weapon/circuitboard/autolathe(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
|
||||
RefreshParts()
|
||||
|
||||
src.L = autolathe_recipes
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
throw_speed = 2
|
||||
throw_range = 5
|
||||
w_class = 3.0
|
||||
flags = TABLEPASS
|
||||
var/created_name = "Cleanbot"
|
||||
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
throw_speed = 2
|
||||
throw_range = 5
|
||||
w_class = 3.0
|
||||
flags = TABLEPASS
|
||||
var/created_name = "Floorbot"
|
||||
|
||||
/obj/item/weapon/toolbox_tiles_sensor
|
||||
@@ -22,7 +21,6 @@
|
||||
throw_speed = 2
|
||||
throw_range = 5
|
||||
w_class = 3.0
|
||||
flags = TABLEPASS
|
||||
var/created_name = "Floorbot"
|
||||
|
||||
//Floorbot
|
||||
|
||||
@@ -219,7 +219,7 @@ Auto Patrol: []"},
|
||||
walk_to(src,0)
|
||||
|
||||
if(target) // make sure target exists
|
||||
if(get_dist(src, src.target) <= 1) // if right next to perp
|
||||
if(get_dist(src, src.target) <= 1 && isturf(src.target.loc)) // if right next to perp
|
||||
playsound(src.loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
|
||||
src.icon_state = "secbot-c"
|
||||
spawn(2)
|
||||
|
||||
@@ -125,7 +125,7 @@
|
||||
//U << text("Now tracking [] on camera.", target.name)
|
||||
//if (U.machine == null)
|
||||
// U.machine = U
|
||||
U << "Now tracking [target.name] on camera."
|
||||
U << "Now tracking [target.get_visible_name()] on camera."
|
||||
|
||||
spawn (0)
|
||||
while (U.cameraFollow == target)
|
||||
|
||||
@@ -3,6 +3,9 @@
|
||||
|
||||
//Potential replacement for genetics revives or something I dunno (?)
|
||||
|
||||
#define CLONE_INITIAL_DAMAGE 190 //Clones in clonepods start with 190 cloneloss damage and 190 brainloss damage, thats just logical
|
||||
|
||||
|
||||
/obj/machinery/clonepod
|
||||
anchored = 1
|
||||
name = "cloning pod"
|
||||
@@ -18,19 +21,30 @@
|
||||
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/speed_coeff
|
||||
var/efficiency
|
||||
|
||||
/obj/machinery/clonepod/New()
|
||||
..()
|
||||
component_parts = list()
|
||||
component_parts += new /obj/item/weapon/circuitboard/clonepod(src)
|
||||
component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
|
||||
component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
|
||||
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
|
||||
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
|
||||
component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
|
||||
component_parts += new /obj/item/weapon/cable_coil(src, 1)
|
||||
component_parts += new /obj/item/weapon/cable_coil(src, 1)
|
||||
component_parts += new /obj/item/weapon/circuitboard/clonepod(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/scanning_module(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/scanning_module(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
|
||||
component_parts += new /obj/item/weapon/cable_coil(null, 1)
|
||||
component_parts += new /obj/item/weapon/cable_coil(null, 1)
|
||||
RefreshParts()
|
||||
|
||||
/obj/machinery/clonepod/RefreshParts()
|
||||
speed_coeff = 0
|
||||
efficiency = 0
|
||||
for(var/obj/item/weapon/stock_parts/scanning_module/S in component_parts)
|
||||
efficiency += S.rating
|
||||
for(var/obj/item/weapon/stock_parts/manipulator/P in component_parts)
|
||||
speed_coeff += P.rating
|
||||
heal_level = (efficiency * 15) + 10
|
||||
|
||||
//The return of data disks?? Just for transferring between genetics machine/cloning machine.
|
||||
//TO-DO: Make the genetics machine accept them.
|
||||
@@ -132,8 +146,6 @@
|
||||
return 0
|
||||
|
||||
|
||||
src.heal_level = rand(50,90) //Randomizes what health the clone is when ejected
|
||||
|
||||
src.attempting = 1 //One at a time!!
|
||||
src.locked = 1
|
||||
|
||||
@@ -150,8 +162,8 @@
|
||||
|
||||
src.icon_state = "pod_1"
|
||||
//Get the clone body ready
|
||||
H.adjustCloneLoss(src.heal_level + 100) //new damage var so you can't eject a clone early then stab them to abuse the current damage system --NeoFite
|
||||
H.adjustBrainLoss(heal_level)
|
||||
H.adjustCloneLoss(CLONE_INITIAL_DAMAGE ) //Yeah, clones start with very low health, not with random, because why would they start with random health
|
||||
H.adjustBrainLoss(CLONE_INITIAL_DAMAGE )
|
||||
H.Paralyse(4)
|
||||
|
||||
//Here let's calculate their health so the pod doesn't immediately eject them!!!
|
||||
@@ -178,7 +190,13 @@
|
||||
// -- End mode specific stuff
|
||||
|
||||
hardset_dna(H, ui, se, null, mrace)
|
||||
randmutb(H) //Sometimes the clones come out wrong.
|
||||
if(efficiency > 2)
|
||||
for(var/A in bad_se_blocks)
|
||||
setblock(H.dna.struc_enzymes, A, construct_block(0,2))
|
||||
if(efficiency > 5 && prob(20))
|
||||
randmutg(H)
|
||||
if(efficiency < 3 && prob(50))
|
||||
randmutb(H)
|
||||
|
||||
if(H.gender == MALE)
|
||||
H.facial_hair_style = "Full Beard"
|
||||
@@ -206,14 +224,14 @@
|
||||
src.connected_message("Clone Rejected: Deceased.")
|
||||
return
|
||||
|
||||
else if(src.occupant.cloneloss > src.heal_level)
|
||||
else if(src.occupant.cloneloss > (100 - src.heal_level))
|
||||
src.occupant.Paralyse(4)
|
||||
|
||||
//Slowly get that clone healed and finished.
|
||||
src.occupant.adjustCloneLoss(-heal_level/50)
|
||||
src.occupant.adjustCloneLoss(-((speed_coeff/2)))
|
||||
|
||||
//Premature clones may have brain damage.
|
||||
src.occupant.adjustBrainLoss(-heal_level/100)
|
||||
src.occupant.adjustBrainLoss(-((speed_coeff/2)))
|
||||
|
||||
//So clones don't die of oxyloss in a running pod.
|
||||
if (src.occupant.reagents.get_reagent_amount("inaprovaline") < 30)
|
||||
@@ -222,7 +240,7 @@
|
||||
use_power(7500) //This might need tweaking.
|
||||
return
|
||||
|
||||
else if((src.occupant.cloneloss <= src.heal_level) && (!src.eject_wait))
|
||||
else if((src.occupant.cloneloss <= (100 - src.heal_level)) && (!src.eject_wait))
|
||||
src.connected_message("Cloning Process Complete.")
|
||||
src.locked = 0
|
||||
src.go_out()
|
||||
@@ -350,7 +368,7 @@
|
||||
return
|
||||
|
||||
/obj/machinery/clonepod/emp_act(severity)
|
||||
if(prob(100/severity)) malfunction()
|
||||
if(prob(100/(severity*efficiency))) malfunction()
|
||||
..()
|
||||
|
||||
/obj/machinery/clonepod/ex_act(severity)
|
||||
@@ -427,4 +445,6 @@
|
||||
/* EMP grenade/spell effect
|
||||
if(istype(A, /obj/machinery/clonepod))
|
||||
A:malfunction()
|
||||
*/
|
||||
*/
|
||||
|
||||
#undef CLONE_INITIAL_DAMAGE
|
||||
@@ -371,7 +371,7 @@
|
||||
throw_range = 5
|
||||
throwforce = 0
|
||||
w_class = 2.0
|
||||
flags = FPRINT | TABLEPASS | NOSHIELD
|
||||
flags = NOSHIELD
|
||||
var/active = 0
|
||||
|
||||
/obj/item/weapon/holo/esword/green
|
||||
|
||||
@@ -279,7 +279,7 @@ That prevents a few funky behaviors.
|
||||
A.loc = T.loc
|
||||
A.cancel_camera()
|
||||
A << "You have been uploaded to a stationary terminal. Remote device connection restored."
|
||||
U << "\blue <b>Transfer succesful</b>: \black [A.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed."
|
||||
U << "\blue <b>Transfer successful</b>: \black [A.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed."
|
||||
del(T)
|
||||
if("AIFIXER")//AI Fixer terminal.
|
||||
var/obj/machinery/computer/aifixer/T = target
|
||||
@@ -303,7 +303,7 @@ That prevents a few funky behaviors.
|
||||
T.overlays -= image('icons/obj/computer.dmi', "ai-fixer-empty")
|
||||
A.cancel_camera()
|
||||
A << "You have been uploaded to a stationary terminal. Sadly, there is no remote access from here."
|
||||
U << "\blue <b>Transfer successful</b>: \black [A.name] ([rand(1000,9999)].exe) installed and executed succesfully. Local copy has been removed."
|
||||
U << "\blue <b>Transfer successful</b>: \black [A.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed."
|
||||
else
|
||||
if(!C.contents.len && T.occupant && !T.active)
|
||||
C.name = "inteliCard - [T.occupant.name]"
|
||||
@@ -315,7 +315,7 @@ That prevents a few funky behaviors.
|
||||
C.icon_state = "aicard-full"
|
||||
T.overlays -= image('icons/obj/computer.dmi', "ai-fixer-full")
|
||||
T.occupant << "You have been downloaded to a mobile storage device. Still no remote access."
|
||||
U << "\blue <b>Transfer succesful</b>: \black [T.occupant.name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory."
|
||||
U << "\blue <b>Transfer successful</b>: \black [T.occupant.name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory."
|
||||
T.occupant.loc = C
|
||||
T.occupant.cancel_camera()
|
||||
T.occupant = null
|
||||
@@ -340,7 +340,7 @@ That prevents a few funky behaviors.
|
||||
T.overlays -= image('icons/obj/computer.dmi', "ai-fixer-empty")
|
||||
A.cancel_camera()
|
||||
A << "You have been uploaded to a stationary terminal. Sadly, there is no remote access from here."
|
||||
U << "\blue <b>Transfer successful</b>: \black [A.name] ([rand(1000,9999)].exe) installed and executed succesfully. Local copy has been removed."
|
||||
U << "\blue <b>Transfer successful</b>: \black [A.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed."
|
||||
else
|
||||
if(!C.AI && T.occupant && !T.active)
|
||||
if (T.occupant.stat)
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
desc = "Does not support Pinball."
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "arcade"
|
||||
circuit = /obj/item/weapon/circuitboard/arcade
|
||||
circuit = /obj/item/weapon/circuitboard/arcade/battle
|
||||
var/enemy_name = "Space Villian"
|
||||
var/temp = "Winners Don't Use Spacedrugs" //Temporary message, for attack messages, etc
|
||||
var/player_hp = 30 //Player health/attack points
|
||||
|
||||
@@ -31,195 +31,195 @@
|
||||
|
||||
/obj/item/weapon/circuitboard/message_monitor
|
||||
name = "circuit board (Message Monitor)"
|
||||
build_path = "/obj/machinery/computer/message_monitor"
|
||||
build_path = /obj/machinery/computer/message_monitor
|
||||
origin_tech = "programming=3"
|
||||
/obj/item/weapon/circuitboard/security
|
||||
name = "circuit board (Security)"
|
||||
build_path = "/obj/machinery/computer/security"
|
||||
build_path = /obj/machinery/computer/security
|
||||
/obj/item/weapon/circuitboard/aicore
|
||||
name = "circuit board (AI core)"
|
||||
origin_tech = "programming=4;biotech=2"
|
||||
board_type = "other"
|
||||
/obj/item/weapon/circuitboard/aiupload
|
||||
name = "circuit board (AI Upload)"
|
||||
build_path = "/obj/machinery/computer/upload/ai"
|
||||
build_path = /obj/machinery/computer/upload/ai
|
||||
origin_tech = "programming=4"
|
||||
/obj/item/weapon/circuitboard/borgupload
|
||||
name = "circuit board (Cyborg Upload)"
|
||||
build_path = "/obj/machinery/computer/upload/borg"
|
||||
build_path = /obj/machinery/computer/upload/borg
|
||||
origin_tech = "programming=4"
|
||||
/obj/item/weapon/circuitboard/med_data
|
||||
name = "circuit board (Medical Records Console)"
|
||||
build_path = "/obj/machinery/computer/med_data"
|
||||
build_path = /obj/machinery/computer/med_data
|
||||
/obj/item/weapon/circuitboard/pandemic
|
||||
name = "circuit board (PanD.E.M.I.C. 2200)"
|
||||
build_path = "/obj/machinery/computer/pandemic"
|
||||
build_path = /obj/machinery/computer/pandemic
|
||||
origin_tech = "programming=2;biotech=2"
|
||||
/obj/item/weapon/circuitboard/scan_consolenew
|
||||
name = "circuit board (DNA Machine)"
|
||||
build_path = "/obj/machinery/computer/scan_consolenew"
|
||||
build_path = /obj/machinery/computer/scan_consolenew
|
||||
origin_tech = "programming=2;biotech=2"
|
||||
/obj/item/weapon/circuitboard/communications
|
||||
name = "circuit board (Communications)"
|
||||
build_path = "/obj/machinery/computer/communications"
|
||||
build_path = /obj/machinery/computer/communications
|
||||
origin_tech = "programming=2;magnets=2"
|
||||
/obj/item/weapon/circuitboard/card
|
||||
name = "circuit board (ID Console)"
|
||||
build_path = "/obj/machinery/computer/card"
|
||||
build_path = /obj/machinery/computer/card
|
||||
/obj/item/weapon/circuitboard/card/centcom
|
||||
name = "circuit board (Centcom ID Console)"
|
||||
build_path = "/obj/machinery/computer/card/centcom"
|
||||
build_path = /obj/machinery/computer/card/centcom
|
||||
//obj/item/weapon/circuitboard/shield
|
||||
// name = "Circuit board (Shield Control)"
|
||||
// build_path = "/obj/machinery/computer/stationshield"
|
||||
// build_path = /obj/machinery/computer/stationshield
|
||||
/obj/item/weapon/circuitboard/teleporter
|
||||
name = "circuit board (Teleporter)"
|
||||
build_path = "/obj/machinery/computer/teleporter"
|
||||
build_path = /obj/machinery/computer/teleporter
|
||||
origin_tech = "programming=2;bluespace=2"
|
||||
/obj/item/weapon/circuitboard/secure_data
|
||||
name = "circuit board (Security Records Console)"
|
||||
build_path = "/obj/machinery/computer/secure_data"
|
||||
build_path = /obj/machinery/computer/secure_data
|
||||
/obj/item/weapon/circuitboard/stationalert
|
||||
name = "circuit board (Station Alerts)"
|
||||
build_path = "/obj/machinery/computer/station_alert"
|
||||
/obj/item/weapon/circuitboard/atmospheresiphonswitch
|
||||
build_path = /obj/machinery/computer/station_alert
|
||||
/*/obj/item/weapon/circuitboard/atmospheresiphonswitch
|
||||
name = "circuit board (Atmosphere siphon control)"
|
||||
build_path = "/obj/machinery/computer/atmosphere/siphonswitch"
|
||||
build_path = /obj/machinery/computer/atmosphere/siphonswitch*/
|
||||
/obj/item/weapon/circuitboard/air_management
|
||||
name = "circuit board (Atmospheric monitor)"
|
||||
build_path = "/obj/machinery/computer/general_air_control"
|
||||
build_path = /obj/machinery/computer/general_air_control
|
||||
/obj/item/weapon/circuitboard/injector_control
|
||||
name = "circuit board (Injector control)"
|
||||
build_path = "/obj/machinery/computer/general_air_control/fuel_injection"
|
||||
build_path = /obj/machinery/computer/general_air_control/fuel_injection
|
||||
/obj/item/weapon/circuitboard/atmos_alert
|
||||
name = "circuit board (Atmospheric Alert)"
|
||||
build_path = "/obj/machinery/computer/atmos_alert"
|
||||
build_path = /obj/machinery/computer/atmos_alert
|
||||
/obj/item/weapon/circuitboard/pod
|
||||
name = "circuit board (Massdriver control)"
|
||||
build_path = "/obj/machinery/computer/pod"
|
||||
build_path = /obj/machinery/computer/pod
|
||||
/obj/item/weapon/circuitboard/robotics
|
||||
name = "circuit board (Robotics Control)"
|
||||
build_path = "/obj/machinery/computer/robotics"
|
||||
build_path = /obj/machinery/computer/robotics
|
||||
origin_tech = "programming=3"
|
||||
/obj/item/weapon/circuitboard/cloning
|
||||
name = "circuit board (Cloning)"
|
||||
build_path = "/obj/machinery/computer/cloning"
|
||||
build_path = /obj/machinery/computer/cloning
|
||||
origin_tech = "programming=3;biotech=3"
|
||||
/obj/item/weapon/circuitboard/arcade/battle
|
||||
name = "circuit board (Arcade Battle)"
|
||||
build_path = "/obj/machinery/computer/arcade/battle"
|
||||
build_path = /obj/machinery/computer/arcade/battle
|
||||
origin_tech = "programming=1"
|
||||
/obj/item/weapon/circuitboard/arcade/orion_trail
|
||||
name = "circuit board (Orion_Trail)"
|
||||
build_path = "/obj/machinery/computer/arcade/orion_trail"
|
||||
build_path = /obj/machinery/computer/arcade/orion_trail
|
||||
origin_tech = "programming=2"
|
||||
/obj/item/weapon/circuitboard/turbine_control
|
||||
name = "circuit board (Turbine control)"
|
||||
build_path = "/obj/machinery/computer/turbine_computer"
|
||||
build_path = /obj/machinery/computer/turbine_computer
|
||||
/obj/item/weapon/circuitboard/solar_control
|
||||
name = "circuit board (Solar Control)" //name fixed 250810
|
||||
build_path = "/obj/machinery/power/solar_control"
|
||||
build_path = /obj/machinery/power/solar_control
|
||||
origin_tech = "programming=2;powerstorage=2"
|
||||
/obj/item/weapon/circuitboard/powermonitor
|
||||
name = "circuit board (Power Monitor)" //name fixed 250810
|
||||
build_path = "/obj/machinery/computer/monitor"
|
||||
build_path = /obj/machinery/computer/monitor
|
||||
/obj/item/weapon/circuitboard/olddoor
|
||||
name = "circuit board (DoorMex)"
|
||||
build_path = "/obj/machinery/computer/pod/old"
|
||||
build_path = /obj/machinery/computer/pod/old
|
||||
/obj/item/weapon/circuitboard/syndicatedoor
|
||||
name = "circuit board (ProComp Executive)"
|
||||
build_path = "/obj/machinery/computer/pod/old/syndicate"
|
||||
build_path = /obj/machinery/computer/pod/old/syndicate
|
||||
/obj/item/weapon/circuitboard/swfdoor
|
||||
name = "circuit board (Magix)"
|
||||
build_path = "/obj/machinery/computer/pod/old/swf"
|
||||
build_path = /obj/machinery/computer/pod/old/swf
|
||||
/obj/item/weapon/circuitboard/prisoner
|
||||
name = "circuit board (Prisoner Management Console)"
|
||||
build_path = "/obj/machinery/computer/prisoner"
|
||||
build_path = /obj/machinery/computer/prisoner
|
||||
/obj/item/weapon/circuitboard/rdconsole
|
||||
name = "circuit Board (RD Console)"
|
||||
build_path = "/obj/machinery/computer/rdconsole/core"
|
||||
build_path = /obj/machinery/computer/rdconsole/core
|
||||
/obj/item/weapon/circuitboard/mecha_control
|
||||
name = "circuit Board (Exosuit Control Console)"
|
||||
build_path = "/obj/machinery/computer/mecha"
|
||||
build_path = /obj/machinery/computer/mecha
|
||||
/obj/item/weapon/circuitboard/rdservercontrol
|
||||
name = "circuit Board (R&D Server Control)"
|
||||
build_path = "/obj/machinery/computer/rdservercontrol"
|
||||
build_path = /obj/machinery/computer/rdservercontrol
|
||||
/obj/item/weapon/circuitboard/crew
|
||||
name = "circuit board (Crew Monitoring Console)"
|
||||
build_path = "/obj/machinery/computer/crew"
|
||||
build_path = /obj/machinery/computer/crew
|
||||
origin_tech = "programming=3;biotech=2;magnets=2"
|
||||
/obj/item/weapon/circuitboard/mech_bay_power_console
|
||||
name = "circuit board (Mech Bay Power Control Console)"
|
||||
build_path = "/obj/machinery/computer/mech_bay_power_console"
|
||||
build_path = /obj/machinery/computer/mech_bay_power_console
|
||||
origin_tech = "programming=2;powerstorage=3"
|
||||
/obj/item/weapon/circuitboard/ordercomp
|
||||
name = "circuit board (Supply Ordering Console)"
|
||||
build_path = "/obj/machinery/computer/ordercomp"
|
||||
build_path = /obj/machinery/computer/ordercomp
|
||||
origin_tech = "programming=2"
|
||||
/obj/item/weapon/circuitboard/supplycomp
|
||||
name = "circuit board (Supply shuttle console)"
|
||||
build_path = "/obj/machinery/computer/supplycomp"
|
||||
build_path = /obj/machinery/computer/supplycomp
|
||||
origin_tech = "programming=3"
|
||||
var/contraband_enabled = 0
|
||||
/obj/item/weapon/circuitboard/operating
|
||||
name = "circuit board (Operating Computer)"
|
||||
build_path = "/obj/machinery/computer/operating"
|
||||
build_path = /obj/machinery/computer/operating
|
||||
origin_tech = "programming=2;biotech=2"
|
||||
/obj/item/weapon/circuitboard/mining
|
||||
name = "circuit board (Outpost Status Display)"
|
||||
build_path = "/obj/machinery/computer/security/mining"
|
||||
build_path = /obj/machinery/computer/security/mining
|
||||
origin_tech = "programming=2"
|
||||
/obj/item/weapon/circuitboard/comm_monitor
|
||||
name = "circuit board (Telecommunications Monitor)"
|
||||
build_path = "/obj/machinery/computer/telecomms/monitor"
|
||||
build_path = /obj/machinery/computer/telecomms/monitor
|
||||
origin_tech = "programming=3"
|
||||
/obj/item/weapon/circuitboard/comm_server
|
||||
name = "circuit board (Telecommunications Server Monitor)"
|
||||
build_path = "/obj/machinery/computer/telecomms/server"
|
||||
build_path = /obj/machinery/computer/telecomms/server
|
||||
origin_tech = "programming=3"
|
||||
/obj/item/weapon/circuitboard/comm_traffic
|
||||
name = "circuitboard (Telecommunications Traffic Control)"
|
||||
build_path = "/obj/machinery/computer/telecomms/traffic"
|
||||
build_path = /obj/machinery/computer/telecomms/traffic
|
||||
origin_tech = "programming=3"
|
||||
/obj/item/weapon/circuitboard/curefab
|
||||
/*/obj/item/weapon/circuitboard/curefab
|
||||
name = "circuit board (Cure fab)"
|
||||
build_path = "/obj/machinery/computer/curer"
|
||||
build_path = /obj/machinery/computer/curer
|
||||
/obj/item/weapon/circuitboard/splicer
|
||||
name = "circuit board (Disease Splicer)"
|
||||
build_path = "/obj/machinery/computer/diseasesplicer"
|
||||
build_path = /obj/machinery/computer/diseasesplicer*/
|
||||
/obj/item/weapon/circuitboard/shuttle
|
||||
name = "circuit board (Shuttle)"
|
||||
build_path = "/obj/machinery/computer/shuttle"
|
||||
build_path = /obj/machinery/computer/shuttle
|
||||
origin_tech = "programming=2"
|
||||
id = "1"
|
||||
/obj/item/weapon/circuitboard/labor_shuttle
|
||||
name = "circuit Board (Labor Shuttle)"
|
||||
build_path = "/obj/machinery/computer/shuttle/labor"
|
||||
build_path = /obj/machinery/computer/shuttle/labor
|
||||
origin_tech = "programming 2"
|
||||
/obj/item/weapon/circuitboard/labor_shuttle/one_way
|
||||
name = "circuit Board (Prisoner Shuttle Console)"
|
||||
build_path = "/obj/machinery/computer/shuttle/labor/one_way"
|
||||
build_path = /obj/machinery/computer/shuttle/labor/one_way
|
||||
origin_tech = "programming 2"
|
||||
/obj/item/weapon/circuitboard/mining_shuttle
|
||||
name = "circuit Board (Mining Shuttle)"
|
||||
build_path = "/obj/machinery/computer/shuttle/mining"
|
||||
build_path = /obj/machinery/computer/shuttle/mining
|
||||
origin_tech = "programming 2"
|
||||
/obj/item/weapon/circuitboard/HolodeckControl // Not going to let people get this, but it's just here for future
|
||||
name = "circuit board (Holodeck Control)"
|
||||
build_path = "/obj/machinery/computer/HolodeckControl"
|
||||
build_path = /obj/machinery/computer/HolodeckControl
|
||||
origin_tech = "programming=4"
|
||||
/obj/item/weapon/circuitboard/aifixer
|
||||
name = "circuit board (AI Integrity Restorer)"
|
||||
build_path = "/obj/machinery/computer/aifixer"
|
||||
build_path = /obj/machinery/computer/aifixer
|
||||
origin_tech = "programming=3;biotech=2"
|
||||
/obj/item/weapon/circuitboard/area_atmos
|
||||
name = "circuit board (Area Air Control)"
|
||||
build_path = "/obj/machinery/computer/area_atmos"
|
||||
build_path = /obj/machinery/computer/area_atmos
|
||||
origin_tech = "programming=2"
|
||||
/obj/item/weapon/circuitboard/prison_shuttle
|
||||
/*/obj/item/weapon/circuitboard/prison_shuttle
|
||||
name = "circuit board (Prison Shuttle)"
|
||||
build_path = "/obj/machinery/computer/prison_shuttle"
|
||||
origin_tech = "programming=2"
|
||||
build_path = /obj/machinery/computer/prison_shuttle
|
||||
origin_tech = "programming=2"*/
|
||||
|
||||
|
||||
/obj/item/weapon/circuitboard/supplycomp/attackby(obj/item/I as obj, mob/user as mob)
|
||||
@@ -247,13 +247,13 @@
|
||||
/obj/item/weapon/circuitboard/rdconsole/attackby(obj/item/I as obj, mob/user as mob)
|
||||
if(istype(I,/obj/item/weapon/screwdriver))
|
||||
if(src.build_path == "/obj/machinery/computer/rdconsole/core")
|
||||
src.name = "circuit board (RD Console - Robotics)"
|
||||
src.build_path = "/obj/machinery/computer/rdconsole/robotics"
|
||||
user << "\blue Access protocols successfully updated."
|
||||
name = "circuit board (RD Console - Robotics)"
|
||||
build_path = /obj/machinery/computer/rdconsole/robotics
|
||||
user << "<span class='notice'>Access protocols successfully updated.</span>"
|
||||
else
|
||||
src.name = "circuit board (RD Console)"
|
||||
src.build_path = "/obj/machinery/computer/rdconsole/core"
|
||||
user << "\blue Defaulting access protocols."
|
||||
name = "circuit board (RD Console)"
|
||||
build_path = /obj/machinery/computer/rdconsole/core
|
||||
user << "<span class='notice'>Defaulting access protocols.</span>"
|
||||
return
|
||||
|
||||
/obj/item/weapon/circuitboard/shuttle/attackby(obj/item/I as obj, mob/user as mob)
|
||||
@@ -264,79 +264,85 @@
|
||||
return
|
||||
|
||||
/obj/structure/computerframe/attackby(obj/item/P as obj, mob/user as mob)
|
||||
add_fingerprint(user)
|
||||
switch(state)
|
||||
if(0)
|
||||
if(istype(P, /obj/item/weapon/wrench))
|
||||
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
|
||||
if(do_after(user, 20))
|
||||
user << "\blue You wrench the frame into place."
|
||||
src.anchored = 1
|
||||
src.state = 1
|
||||
user << "<span class='notice'>You wrench the frame into place.</span>"
|
||||
anchored = 1
|
||||
state = 1
|
||||
if(istype(P, /obj/item/weapon/weldingtool))
|
||||
var/obj/item/weapon/weldingtool/WT = P
|
||||
if(!WT.remove_fuel(0, user))
|
||||
user << "The welding tool must be on to complete this task."
|
||||
user << "<span class='warning'>The welding tool must be on to complete this task.</span>"
|
||||
return
|
||||
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
|
||||
if(do_after(user, 20))
|
||||
if(!src || !WT.isOn()) return
|
||||
user << "\blue You deconstruct the frame."
|
||||
new /obj/item/stack/sheet/metal( src.loc, 5 )
|
||||
user << "<span class='notice'>You deconstruct the frame.</span>"
|
||||
var/obj/item/stack/sheet/metal/M = new (loc, 5)
|
||||
M.add_fingerprint(user)
|
||||
del(src)
|
||||
if(1)
|
||||
if(istype(P, /obj/item/weapon/wrench))
|
||||
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
|
||||
if(do_after(user, 20))
|
||||
user << "\blue You unfasten the frame."
|
||||
src.anchored = 0
|
||||
src.state = 0
|
||||
user << "<span class='notice'>You unfasten the frame.</span>"
|
||||
anchored = 0
|
||||
state = 0
|
||||
if(istype(P, /obj/item/weapon/circuitboard) && !circuit)
|
||||
var/obj/item/weapon/circuitboard/B = P
|
||||
if(B.board_type == "computer")
|
||||
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
user << "\blue You place the circuit board inside the frame."
|
||||
src.icon_state = "1"
|
||||
src.circuit = P
|
||||
user << "<span class='notice'>You place the circuit board inside the frame.</span>"
|
||||
icon_state = "1"
|
||||
circuit = P
|
||||
user.drop_item()
|
||||
circuit.add_fingerprint(user)
|
||||
P.loc = src
|
||||
else
|
||||
user << "\red This frame does not accept circuit boards of this type!"
|
||||
user << "<span class='warning'>This frame does not accept circuit boards of this type!</span>"
|
||||
if(istype(P, /obj/item/weapon/screwdriver) && circuit)
|
||||
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
|
||||
user << "\blue You screw the circuit board into place."
|
||||
src.state = 2
|
||||
src.icon_state = "2"
|
||||
user << "<span class='notice'>You screw the circuit board into place.</span>"
|
||||
state = 2
|
||||
icon_state = "2"
|
||||
if(istype(P, /obj/item/weapon/crowbar) && circuit)
|
||||
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
|
||||
user << "\blue You remove the circuit board."
|
||||
src.state = 1
|
||||
src.icon_state = "0"
|
||||
user << "<span class='notice'>You remove the circuit board.</span>"
|
||||
state = 1
|
||||
icon_state = "0"
|
||||
circuit.loc = src.loc
|
||||
src.circuit = null
|
||||
circuit.add_fingerprint(user)
|
||||
circuit = null
|
||||
if(2)
|
||||
if(istype(P, /obj/item/weapon/screwdriver) && circuit)
|
||||
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
|
||||
user << "\blue You unfasten the circuit board."
|
||||
user << "<span class='notice'>You unfasten the circuit board.</span>"
|
||||
src.state = 1
|
||||
src.icon_state = "1"
|
||||
if(istype(P, /obj/item/weapon/cable_coil))
|
||||
if(P:amount >= 5)
|
||||
var/obj/item/weapon/cable_coil/C = P
|
||||
if(C.amount >= 5)
|
||||
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
if(do_after(user, 20))
|
||||
if(P)
|
||||
P:amount -= 5
|
||||
if(!P:amount) del(P)
|
||||
user << "\blue You add cables to the frame."
|
||||
if(C && C.amount >= 5)
|
||||
C.amount -= 5
|
||||
if(C.amount <= 0) del(C)
|
||||
user << "<span class='notice'>You add cables to the frame.</span>"
|
||||
src.state = 3
|
||||
src.icon_state = "3"
|
||||
if(3)
|
||||
if(istype(P, /obj/item/weapon/wirecutters))
|
||||
playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
|
||||
user << "\blue You remove the cables."
|
||||
user << "<span class='notice'>You remove the cables.</span>"
|
||||
src.state = 2
|
||||
src.icon_state = "2"
|
||||
var/obj/item/weapon/cable_coil/A = new /obj/item/weapon/cable_coil( src.loc )
|
||||
var/obj/item/weapon/cable_coil/A = new (loc)
|
||||
A.amount = 5
|
||||
A.add_fingerprint(user)
|
||||
|
||||
if(istype(P, /obj/item/stack/sheet/glass))
|
||||
if(P:amount >= 2)
|
||||
@@ -344,20 +350,21 @@
|
||||
if(do_after(user, 20))
|
||||
if(P)
|
||||
P:use(2)
|
||||
user << "\blue You put in the glass panel."
|
||||
user << "<span class='notice'>You put in the glass panel.</span>"
|
||||
src.state = 4
|
||||
src.icon_state = "4"
|
||||
if(4)
|
||||
if(istype(P, /obj/item/weapon/crowbar))
|
||||
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
|
||||
user << "\blue You remove the glass panel."
|
||||
user << "<span class='notice'>You remove the glass panel.</span>"
|
||||
src.state = 3
|
||||
src.icon_state = "3"
|
||||
new /obj/item/stack/sheet/glass( src.loc, 2 )
|
||||
var/obj/item/stack/sheet/glass/G = new (loc, 2)
|
||||
G.add_fingerprint(user)
|
||||
if(istype(P, /obj/item/weapon/screwdriver))
|
||||
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
|
||||
user << "\blue You connect the monitor."
|
||||
var/B = new src.circuit.build_path ( src.loc )
|
||||
user << "<span class='notice'>You connect the monitor.</span>"
|
||||
var/obj/B = new src.circuit.build_path (src.loc)
|
||||
if(circuit.powernet) B:powernet = circuit.powernet
|
||||
if(circuit.id) B:id = circuit.id
|
||||
if(circuit.records) B:records = circuit.records
|
||||
@@ -370,4 +377,5 @@
|
||||
var/obj/machinery/computer/shuttle/S = B
|
||||
var/obj/item/weapon/circuitboard/shuttle/C = circuit
|
||||
S.id = C.id
|
||||
transfer_fingerprints_to(B)
|
||||
del(src)
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
var/datum/data/record/active_record = null
|
||||
var/obj/item/weapon/disk/data/diskette = null //Mostly so the geneticist can steal everything.
|
||||
var/loading = 0 // Nice loading text
|
||||
var/autoprocess = 0
|
||||
|
||||
/obj/machinery/computer/cloning/New()
|
||||
..()
|
||||
@@ -23,6 +24,19 @@
|
||||
return
|
||||
return
|
||||
|
||||
/obj/machinery/computer/cloning/process()
|
||||
if(!(scanner && pod1 && autoprocess))
|
||||
return
|
||||
|
||||
if(scanner.occupant && (scanner.scan_level > 2))
|
||||
scan_mob(scanner.occupant)
|
||||
|
||||
if(!(pod1.occupant || pod1.mess) && (pod1.efficiency > 5))
|
||||
for(var/datum/data/record/R in records)
|
||||
if(!(pod1.occupant || pod1.mess))
|
||||
if(pod1.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"]))
|
||||
records -= R
|
||||
|
||||
/obj/machinery/computer/cloning/proc/updatemodules()
|
||||
src.scanner = findscanner()
|
||||
src.pod1 = findcloner()
|
||||
@@ -82,7 +96,13 @@
|
||||
|
||||
var/dat = ""
|
||||
dat += "<a href='byond://?src=\ref[src];refresh=1'>Refresh</a>"
|
||||
|
||||
if(scanner && pod1 && ((scanner.scan_level > 2) || (pod1.efficiency > 5)))
|
||||
if(!autoprocess)
|
||||
dat += "<a href='byond://?src=\ref[src];task=autoprocess'>Autoprocess</a>"
|
||||
else
|
||||
dat += "<a href='byond://?src=\ref[src];task=stopautoprocess'>Stop autoprocess</a>"
|
||||
else
|
||||
dat += "<span class='linkOff'>Autoprocess</span>"
|
||||
dat += "<h3>Cloning Pod Status</h3>"
|
||||
dat += "<div class='statusDisplay'>[temp] </div>"
|
||||
|
||||
@@ -200,7 +220,14 @@
|
||||
if(loading)
|
||||
return
|
||||
|
||||
if ((href_list["scan"]) && (!isnull(src.scanner)))
|
||||
if(href_list["task"])
|
||||
switch(href_list["task"])
|
||||
if("autoprocess")
|
||||
autoprocess = 1
|
||||
if("stopautoprocess")
|
||||
autoprocess = 0
|
||||
|
||||
else if ((href_list["scan"]) && (!isnull(src.scanner)))
|
||||
scantemp = ""
|
||||
|
||||
loading = 1
|
||||
@@ -325,7 +352,7 @@
|
||||
if (subject.suiciding == 1)
|
||||
scantemp = "<font class='bad'>Subject's brain is not responding to scanning stimuli.</font>"
|
||||
return
|
||||
if (NOCLONE in subject.mutations)
|
||||
if (NOCLONE in subject.mutations && src.scanner.scan_level < 2)
|
||||
scantemp = "<font class='bad'>Subject no longer contains the fundamental materials required to create a living clone.</font>"
|
||||
return
|
||||
if ((!subject.ckey) || (!subject.client))
|
||||
|
||||
@@ -439,7 +439,7 @@
|
||||
if( customrecepient.loc && ishuman(customrecepient.loc) )
|
||||
var/mob/living/carbon/human/H = customrecepient.loc
|
||||
H << "\icon[customrecepient] <b>Message from [customsender] ([customjob]), </b>\"[custommessage]\" (<a href='byond://?src=\ref[src];choice=Message;skiprefresh=1;target=\ref[src]'>Reply</a>)"
|
||||
log_pda("[usr] (PDA: [customsender]) sent \"[custommessage]\" to [customrecepient.owner]")
|
||||
log_pda("[usr]/([usr.ckey]) (PDA: [customsender]) sent \"[custommessage]\" to [customrecepient.owner]")
|
||||
customrecepient.overlays.Cut()
|
||||
customrecepient.overlays += image('icons/obj/pda.dmi', "pda-r")
|
||||
//Sender is faking as someone who exists
|
||||
@@ -453,7 +453,7 @@
|
||||
if( customrecepient.loc && ishuman(customrecepient.loc) )
|
||||
var/mob/living/carbon/human/H = customrecepient.loc
|
||||
H << "\icon[customrecepient] <b>Message from [PDARec.owner] ([customjob]), </b>\"[custommessage]\" (<a href='byond://?src=\ref[customrecepient];choice=Message;skiprefresh=1;target=\ref[PDARec]'>Reply</a>)"
|
||||
log_pda("[usr] (PDA: [PDARec.owner]) sent \"[custommessage]\" to [customrecepient.owner]")
|
||||
log_pda("[usr]/([usr.ckey]) (PDA: [PDARec.owner]) sent \"[custommessage]\" to [customrecepient.owner]")
|
||||
customrecepient.overlays.Cut()
|
||||
customrecepient.overlays += image('icons/obj/pda.dmi', "pda-r")
|
||||
//Finally..
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
attackby(var/obj/item/weapon/card/W as obj, var/mob/user as mob)
|
||||
if(stat & (BROKEN|NOPOWER)) return
|
||||
if ((!( istype(W, /obj/item/weapon/card) ) || !( ticker ) || emergency_shuttle.location != DOCKED || !( user ))) return
|
||||
if (!( istype(W, /obj/item/weapon/card) ) || !( ticker ) || emergency_shuttle.location != DOCKED || !( user ) || emergency_shuttle.timeleft() < 11) return
|
||||
if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
|
||||
if (istype(W, /obj/item/device/pda))
|
||||
var/obj/item/device/pda/pda = W
|
||||
|
||||
@@ -162,7 +162,7 @@ to destroy them and players will be able to make replacements.
|
||||
*/
|
||||
/obj/item/weapon/circuitboard/destructive_analyzer
|
||||
name = "circuit board (Destructive Analyzer)"
|
||||
build_path = "/obj/machinery/r_n_d/destructive_analyzer"
|
||||
build_path = /obj/machinery/r_n_d/destructive_analyzer
|
||||
board_type = "machine"
|
||||
origin_tech = "magnets=2;engineering=2;programming=2"
|
||||
req_components = list(
|
||||
@@ -172,7 +172,7 @@ to destroy them and players will be able to make replacements.
|
||||
|
||||
/obj/item/weapon/circuitboard/autolathe
|
||||
name = "circuit board (Autolathe)"
|
||||
build_path = "/obj/machinery/autolathe"
|
||||
build_path = /obj/machinery/autolathe
|
||||
board_type = "machine"
|
||||
origin_tech = "engineering=2;programming=2"
|
||||
req_components = list(
|
||||
@@ -182,7 +182,7 @@ to destroy them and players will be able to make replacements.
|
||||
|
||||
/obj/item/weapon/circuitboard/protolathe
|
||||
name = "circuit board (Protolathe)"
|
||||
build_path = "/obj/machinery/r_n_d/protolathe"
|
||||
build_path = /obj/machinery/r_n_d/protolathe
|
||||
board_type = "machine"
|
||||
origin_tech = "engineering=2;programming=2"
|
||||
req_components = list(
|
||||
@@ -193,7 +193,7 @@ to destroy them and players will be able to make replacements.
|
||||
|
||||
/obj/item/weapon/circuitboard/circuit_imprinter
|
||||
name = "circuit board (Circuit Imprinter)"
|
||||
build_path = "/obj/machinery/r_n_d/circuit_imprinter"
|
||||
build_path = /obj/machinery/r_n_d/circuit_imprinter
|
||||
board_type = "machine"
|
||||
origin_tech = "engineering=2;programming=2"
|
||||
req_components = list(
|
||||
@@ -203,7 +203,7 @@ to destroy them and players will be able to make replacements.
|
||||
|
||||
/obj/item/weapon/circuitboard/pacman
|
||||
name = "circuit board (PACMAN-type Generator)"
|
||||
build_path = "/obj/machinery/power/port_gen/pacman"
|
||||
build_path = /obj/machinery/power/port_gen/pacman
|
||||
board_type = "machine"
|
||||
origin_tech = "programming=3:powerstorage=3;plasmatech=3;engineering=3"
|
||||
req_components = list(
|
||||
@@ -214,7 +214,7 @@ to destroy them and players will be able to make replacements.
|
||||
|
||||
/obj/item/weapon/circuitboard/pacman/super
|
||||
name = "circuit board (SUPERPACMAN-type Generator)"
|
||||
build_path = "/obj/machinery/power/port_gen/pacman/super"
|
||||
build_path = /obj/machinery/power/port_gen/pacman/super
|
||||
origin_tech = "programming=3;powerstorage=4;engineering=4"
|
||||
|
||||
/obj/item/weapon/circuitboard/pacman/mrs
|
||||
@@ -224,7 +224,7 @@ to destroy them and players will be able to make replacements.
|
||||
|
||||
obj/item/weapon/circuitboard/rdserver
|
||||
name = "circuit board (R&D Server)"
|
||||
build_path = "/obj/machinery/r_n_d/server"
|
||||
build_path = /obj/machinery/r_n_d/server
|
||||
board_type = "machine"
|
||||
origin_tech = "programming=3"
|
||||
req_components = list(
|
||||
@@ -233,7 +233,7 @@ obj/item/weapon/circuitboard/rdserver
|
||||
|
||||
/obj/item/weapon/circuitboard/mechfab
|
||||
name = "circuit board (Exosuit Fabricator)"
|
||||
build_path = "/obj/machinery/mecha_part_fabricator"
|
||||
build_path = /obj/machinery/mecha_part_fabricator
|
||||
board_type = "machine"
|
||||
origin_tech = "programming=3;engineering=3"
|
||||
req_components = list(
|
||||
@@ -244,7 +244,7 @@ obj/item/weapon/circuitboard/rdserver
|
||||
|
||||
/obj/item/weapon/circuitboard/clonepod
|
||||
name = "circuit board (Clone Pod)"
|
||||
build_path = "/obj/machinery/clonepod"
|
||||
build_path = /obj/machinery/clonepod
|
||||
board_type = "machine"
|
||||
origin_tech = "programming=3;biotech=3"
|
||||
req_components = list(
|
||||
@@ -255,7 +255,7 @@ obj/item/weapon/circuitboard/rdserver
|
||||
|
||||
/obj/item/weapon/circuitboard/clonescanner
|
||||
name = "circuit board (Cloning Scanner)"
|
||||
build_path = "/obj/machinery/dna_scannernew"
|
||||
build_path = /obj/machinery/dna_scannernew
|
||||
board_type = "machine"
|
||||
origin_tech = "programming=2;biotech=2"
|
||||
req_components = list(
|
||||
@@ -267,7 +267,7 @@ obj/item/weapon/circuitboard/rdserver
|
||||
|
||||
/obj/item/weapon/circuitboard/cyborgrecharger
|
||||
name = "circuit board (Cyborg Recharger)"
|
||||
build_path = "/obj/machinery/recharge_station"
|
||||
build_path = /obj/machinery/recharge_station
|
||||
board_type = "machine"
|
||||
origin_tech = "powerstorage=3;engineering=3"
|
||||
req_components = list(
|
||||
@@ -279,7 +279,7 @@ obj/item/weapon/circuitboard/rdserver
|
||||
|
||||
/obj/item/weapon/circuitboard/telecomms/receiver
|
||||
name = "circuit board (Subspace Receiver)"
|
||||
build_path = "/obj/machinery/telecomms/receiver"
|
||||
build_path = /obj/machinery/telecomms/receiver
|
||||
board_type = "machine"
|
||||
origin_tech = "programming=2;engineering=2;bluespace=1"
|
||||
req_components = list(
|
||||
@@ -290,7 +290,7 @@ obj/item/weapon/circuitboard/rdserver
|
||||
|
||||
/obj/item/weapon/circuitboard/telecomms/hub
|
||||
name = "circuit board (Hub Mainframe)"
|
||||
build_path = "/obj/machinery/telecomms/hub"
|
||||
build_path = /obj/machinery/telecomms/hub
|
||||
board_type = "machine"
|
||||
origin_tech = "programming=2;engineering=2"
|
||||
req_components = list(
|
||||
@@ -300,7 +300,7 @@ obj/item/weapon/circuitboard/rdserver
|
||||
|
||||
/obj/item/weapon/circuitboard/telecomms/relay
|
||||
name = "circuit board (Relay Mainframe)"
|
||||
build_path = "/obj/machinery/telecomms/relay"
|
||||
build_path = /obj/machinery/telecomms/relay
|
||||
board_type = "machine"
|
||||
origin_tech = "programming=2;engineering=2;bluespace=2"
|
||||
req_components = list(
|
||||
@@ -310,7 +310,7 @@ obj/item/weapon/circuitboard/rdserver
|
||||
|
||||
/obj/item/weapon/circuitboard/telecomms/bus
|
||||
name = "circuit board (Bus Mainframe)"
|
||||
build_path = "/obj/machinery/telecomms/bus"
|
||||
build_path = /obj/machinery/telecomms/bus
|
||||
board_type = "machine"
|
||||
origin_tech = "programming=2;engineering=2"
|
||||
req_components = list(
|
||||
@@ -320,7 +320,7 @@ obj/item/weapon/circuitboard/rdserver
|
||||
|
||||
/obj/item/weapon/circuitboard/telecomms/processor
|
||||
name = "circuit board (Processor Unit)"
|
||||
build_path = "/obj/machinery/telecomms/processor"
|
||||
build_path = /obj/machinery/telecomms/processor
|
||||
board_type = "machine"
|
||||
origin_tech = "programming=2;engineering=2"
|
||||
req_components = list(
|
||||
@@ -333,7 +333,7 @@ obj/item/weapon/circuitboard/rdserver
|
||||
|
||||
/obj/item/weapon/circuitboard/telecomms/server
|
||||
name = "circuit board (Telecommunication Server)"
|
||||
build_path = "/obj/machinery/telecomms/server"
|
||||
build_path = /obj/machinery/telecomms/server
|
||||
board_type = "machine"
|
||||
origin_tech = "programming=2;engineering=2"
|
||||
req_components = list(
|
||||
@@ -343,7 +343,7 @@ obj/item/weapon/circuitboard/rdserver
|
||||
|
||||
/obj/item/weapon/circuitboard/telecomms/broadcaster
|
||||
name = "circuit board (Subspace Broadcaster)"
|
||||
build_path = "/obj/machinery/telecomms/broadcaster"
|
||||
build_path = /obj/machinery/telecomms/broadcaster
|
||||
board_type = "machine"
|
||||
origin_tech = "programming=2;engineering=2;bluespace=1"
|
||||
req_components = list(
|
||||
|
||||
@@ -67,9 +67,9 @@
|
||||
return
|
||||
|
||||
/obj/machinery/door/Move()
|
||||
air_update_turf(1)
|
||||
var/turf/T = loc
|
||||
..()
|
||||
air_update_turf(1)
|
||||
move_update_air(T)
|
||||
|
||||
/obj/machinery/door/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
if(air_group) return 0
|
||||
|
||||
@@ -409,10 +409,10 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
|
||||
dat+="<FONT COLOR='green'>Wanted issue for [src.channel_name] successfully edited.</FONT><BR><BR>"
|
||||
dat+="<BR><A href='?src=\ref[src];setScreen=[0]'>Return</A><BR>"
|
||||
if(20)
|
||||
dat+="<FONT COLOR='green'>Printing successfull. Please receive your newspaper from the bottom of the machine.</FONT><BR><BR>"
|
||||
dat+="<FONT COLOR='green'>Printing successful. Please receive your newspaper from the bottom of the machine.</FONT><BR><BR>"
|
||||
dat+="<A href='?src=\ref[src];setScreen=[0]'>Return</A>"
|
||||
if(21)
|
||||
dat+="<FONT COLOR='maroon'>Unable to print newspaper. Insufficient paper. Please notify maintenance personnell to refill machine storage.</FONT><BR><BR>"
|
||||
dat+="<FONT COLOR='maroon'>Unable to print newspaper. Insufficient paper. Please notify maintenance personnel to refill machine storage.</FONT><BR><BR>"
|
||||
dat+="<A href='?src=\ref[src];setScreen=[0]'>Return</A>"
|
||||
else
|
||||
dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com"
|
||||
|
||||
@@ -20,6 +20,7 @@ Buildable meters
|
||||
#define PIPE_PASSIVE_GATE 15
|
||||
#define PIPE_VOLUME_PUMP 16
|
||||
#define PIPE_HEAT_EXCHANGE 17
|
||||
#define PIPE_DVALVE 18
|
||||
|
||||
/obj/item/pipe
|
||||
name = "pipe"
|
||||
@@ -31,7 +32,6 @@ Buildable meters
|
||||
icon = 'icons/obj/pipe-item.dmi'
|
||||
icon_state = "simple"
|
||||
item_state = "buildpipe"
|
||||
flags = TABLEPASS|FPRINT
|
||||
w_class = 3
|
||||
level = 2
|
||||
|
||||
@@ -59,6 +59,8 @@ Buildable meters
|
||||
src.pipe_type = PIPE_MANIFOLD
|
||||
else if(istype(make_from, /obj/machinery/atmospherics/unary/vent_pump))
|
||||
src.pipe_type = PIPE_UVENT
|
||||
else if(istype(make_from, /obj/machinery/atmospherics/valve/digital))
|
||||
src.pipe_type = PIPE_DVALVE
|
||||
else if(istype(make_from, /obj/machinery/atmospherics/valve))
|
||||
src.pipe_type = PIPE_MVALVE
|
||||
else if(istype(make_from, /obj/machinery/atmospherics/binary/pump))
|
||||
@@ -94,8 +96,8 @@ Buildable meters
|
||||
"connector", \
|
||||
"manifold", \
|
||||
"junction", \
|
||||
"uvent", \
|
||||
"mvalve", \
|
||||
"vent", \
|
||||
"manual valve", \
|
||||
"pump", \
|
||||
"scrubber", \
|
||||
"insulated pipe", \
|
||||
@@ -105,6 +107,7 @@ Buildable meters
|
||||
"passive gate", \
|
||||
"volume pump", \
|
||||
"heat exchanger", \
|
||||
"digital valve", \
|
||||
)
|
||||
name = nlist[pipe_type+1] + " fitting"
|
||||
var/list/islist = list( \
|
||||
@@ -126,6 +129,7 @@ Buildable meters
|
||||
"passivegate", \
|
||||
"volumepump", \
|
||||
"heunary", \
|
||||
"dvalve", \
|
||||
)
|
||||
icon_state = islist[pipe_type + 1]
|
||||
|
||||
@@ -144,7 +148,7 @@ Buildable meters
|
||||
|
||||
src.dir = turn(src.dir, -90)
|
||||
|
||||
if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE))
|
||||
if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE, PIPE_DVALVE))
|
||||
if(dir==2)
|
||||
dir = 1
|
||||
else if(dir==8)
|
||||
@@ -157,7 +161,7 @@ Buildable meters
|
||||
if ((pipe_type in list (PIPE_SIMPLE_BENT, PIPE_HE_BENT, PIPE_INSULATED_BENT)) \
|
||||
&& (src.dir in cardinal))
|
||||
src.dir = src.dir|turn(src.dir, 90)
|
||||
else if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE))
|
||||
else if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE, PIPE_DVALVE))
|
||||
if(dir==2)
|
||||
dir = 1
|
||||
else if(dir==8)
|
||||
@@ -177,11 +181,12 @@ Buildable meters
|
||||
if( PIPE_SIMPLE_STRAIGHT, \
|
||||
PIPE_INSULATED_STRAIGHT, \
|
||||
PIPE_HE_STRAIGHT, \
|
||||
PIPE_JUNCTION ,\
|
||||
PIPE_PUMP ,\
|
||||
PIPE_VOLUME_PUMP ,\
|
||||
PIPE_PASSIVE_GATE ,\
|
||||
PIPE_MVALVE \
|
||||
PIPE_JUNCTION, \
|
||||
PIPE_PUMP, \
|
||||
PIPE_VOLUME_PUMP, \
|
||||
PIPE_PASSIVE_GATE, \
|
||||
PIPE_MVALVE, \
|
||||
PIPE_DVALVE \
|
||||
)
|
||||
return dir|flip
|
||||
if(PIPE_SIMPLE_BENT, PIPE_INSULATED_BENT, PIPE_HE_BENT)
|
||||
@@ -236,7 +241,7 @@ Buildable meters
|
||||
return ..()
|
||||
if (!isturf(src.loc))
|
||||
return 1
|
||||
if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE))
|
||||
if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE, PIPE_DVALVE))
|
||||
if(dir==2)
|
||||
dir = 1
|
||||
else if(dir==8)
|
||||
@@ -361,7 +366,7 @@ Buildable meters
|
||||
|
||||
|
||||
if(PIPE_MVALVE) //manual valve
|
||||
var/obj/machinery/atmospherics/valve/V = new( src.loc)
|
||||
var/obj/machinery/atmospherics/valve/V = new(src.loc)
|
||||
V.dir = dir
|
||||
V.initialize_directions = pipe_dir
|
||||
if (pipename)
|
||||
@@ -379,6 +384,23 @@ Buildable meters
|
||||
V.node2.initialize()
|
||||
V.node2.build_network()
|
||||
|
||||
if(PIPE_DVALVE) //Digital valves. Shameless copypaste from manual valves because I don't into atmos code.
|
||||
var/obj/machinery/atmospherics/valve/digital/V = new(src.loc)
|
||||
V.dir = dir
|
||||
V.initialize_directions = pipe_dir
|
||||
if (pipename)
|
||||
V.name = pipename
|
||||
var/turf/T = V.loc
|
||||
V.level = T.intact ? 2 : 1
|
||||
V.initialize()
|
||||
V.build_network()
|
||||
if (V.node1)
|
||||
V.node1.initialize()
|
||||
V.node1.build_network()
|
||||
if (V.node2)
|
||||
V.node2.initialize()
|
||||
V.node2.build_network()
|
||||
|
||||
if(PIPE_PUMP) //gas pump
|
||||
var/obj/machinery/atmospherics/binary/pump/P = new(src.loc)
|
||||
P.dir = dir
|
||||
@@ -536,7 +558,6 @@ Buildable meters
|
||||
icon = 'icons/obj/pipe-item.dmi'
|
||||
icon_state = "meter"
|
||||
item_state = "buildpipe"
|
||||
flags = TABLEPASS|FPRINT
|
||||
w_class = 4
|
||||
|
||||
/obj/item/pipe_meter/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
|
||||
@@ -569,4 +590,5 @@ Buildable meters
|
||||
#undef PIPE_GAS_MIXER
|
||||
#undef PIPE_PASSIVE_GATE
|
||||
#undef PIPE_VOLUME_PUMP
|
||||
#undef PIPE_OUTLET_INJECT
|
||||
#undef PIPE_OUTLET_INJECT
|
||||
#undef PIPE_DVALVE
|
||||
@@ -18,9 +18,10 @@
|
||||
<A href='?src=\ref[src];make=1;dir=5'>Bent Pipe</A><BR>
|
||||
<A href='?src=\ref[src];make=5;dir=1'>Manifold</A><BR>
|
||||
<A href='?src=\ref[src];make=8;dir=1'>Manual Valve</A><BR>
|
||||
<A href='?src=\ref[src];make=18;dir=1'>Digital Valve</A><BR>
|
||||
<b>Devices:</b><BR>
|
||||
<A href='?src=\ref[src];make=4;dir=1'>Connector</A><BR>
|
||||
<A href='?src=\ref[src];make=7;dir=1'>Unary Vent</A><BR>
|
||||
<A href='?src=\ref[src];make=7;dir=1'>Vent</A><BR>
|
||||
<A href='?src=\ref[src];make=9;dir=1'>Gas Pump</A><BR>
|
||||
<A href='?src=\ref[src];make=15;dir=1'>Passive Gate</A><BR>
|
||||
<A href='?src=\ref[src];make=16;dir=1'>Volume Pump</A><BR>
|
||||
@@ -70,7 +71,7 @@
|
||||
return
|
||||
|
||||
/obj/machinery/pipedispenser/attackby(var/obj/item/W as obj, var/mob/user as mob)
|
||||
src.add_fingerprint(usr)
|
||||
add_fingerprint(user)
|
||||
if (istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter))
|
||||
usr << "<span class='notice'>You put [W] back into [src].</span>"
|
||||
user.drop_item()
|
||||
|
||||
@@ -13,12 +13,32 @@
|
||||
var/circuitboard = "/obj/item/weapon/circuitboard/cyborgrecharger"
|
||||
var/locked = 1
|
||||
req_access = list(access_robotics)
|
||||
var/recharge_speed
|
||||
var/repairs
|
||||
|
||||
|
||||
/obj/machinery/recharge_station/New()
|
||||
..()
|
||||
component_parts = list()
|
||||
component_parts += new /obj/item/weapon/circuitboard/cyborgrecharger(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
|
||||
component_parts += new /obj/item/weapon/cell/high(null)
|
||||
RefreshParts()
|
||||
build_icon()
|
||||
|
||||
/obj/machinery/recharge_station/RefreshParts()
|
||||
recharge_speed = 0
|
||||
repairs = 0
|
||||
for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts)
|
||||
recharge_speed += C.rating * 100
|
||||
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
|
||||
repairs += M.rating - 1
|
||||
for(var/obj/item/weapon/cell/C in component_parts)
|
||||
recharge_speed *= C.maxcharge / 10000
|
||||
|
||||
|
||||
/obj/machinery/recharge_station/process()
|
||||
if(!(NOPOWER|BROKEN))
|
||||
return
|
||||
@@ -230,22 +250,25 @@
|
||||
/obj/machinery/recharge_station/proc/process_occupant()
|
||||
if(occupant)
|
||||
restock_modules()
|
||||
if(repairs)
|
||||
occupant.heal_organ_damage(repairs, repairs - 1)
|
||||
if(occupant.cell)
|
||||
if(occupant.cell.charge >= occupant.cell.maxcharge)
|
||||
occupant.cell.charge = occupant.cell.maxcharge
|
||||
else
|
||||
occupant.cell.charge = min(occupant.cell.charge + 200, occupant.cell.maxcharge)
|
||||
occupant.cell.charge = min(occupant.cell.charge + recharge_speed, occupant.cell.maxcharge)
|
||||
|
||||
/obj/machinery/recharge_station/proc/restock_modules()
|
||||
if(occupant)
|
||||
if(occupant.module && occupant.module.modules)
|
||||
var/list/um = occupant.contents|occupant.module.modules
|
||||
// ^ makes sinle list of active (occupant.contents) and inactive modules (occupant.module.modules)
|
||||
var/coeff = recharge_speed / 200
|
||||
for(var/obj/O in um)
|
||||
// Engineering
|
||||
if(istype(O,/obj/item/stack/sheet/metal) || istype(O,/obj/item/stack/sheet/rglass) || istype(O,/obj/item/stack/rods) || istype(O,/obj/item/weapon/cable_coil)|| istype(O,/obj/item/stack/tile/plasteel))
|
||||
if(O:amount < 50)
|
||||
O:amount += 1
|
||||
O:amount += coeff
|
||||
// Security
|
||||
if(istype(O,/obj/item/device/flash))
|
||||
if(O:broken)
|
||||
@@ -254,7 +277,7 @@
|
||||
O:icon_state = "flash"
|
||||
if(istype(O,/obj/item/weapon/gun/energy/taser/cyborg))
|
||||
if(O:power_supply.charge < O:power_supply.maxcharge)
|
||||
O:power_supply.give(O:charge_cost)
|
||||
O:power_supply.give(O:charge_cost * coeff)
|
||||
O:update_icon()
|
||||
else
|
||||
O:charge_tick = 0
|
||||
@@ -265,16 +288,18 @@
|
||||
//Service
|
||||
if(istype(O,/obj/item/weapon/reagent_containers/food/condiment/enzyme))
|
||||
if(O.reagents.get_reagent_amount("enzyme") < 50)
|
||||
O.reagents.add_reagent("enzyme", 2)
|
||||
O.reagents.add_reagent("enzyme", 2 * coeff)
|
||||
//Medical
|
||||
if(istype(O,/obj/item/weapon/reagent_containers/glass/bottle/robot))
|
||||
var/obj/item/weapon/reagent_containers/glass/bottle/robot/B = O
|
||||
if(B.reagent && (B.reagents.get_reagent_amount(B.reagent) < B.volume))
|
||||
B.reagents.add_reagent(B.reagent, 2)
|
||||
B.reagents.add_reagent(B.reagent, 2 * coeff)
|
||||
//Janitor
|
||||
if(istype(O, /obj/item/device/lightreplacer))
|
||||
var/obj/item/device/lightreplacer/LR = O
|
||||
LR.Charge(occupant)
|
||||
var/i = 1
|
||||
for(1, i < coeff, i++)
|
||||
LR.Charge(occupant)
|
||||
|
||||
if(occupant)
|
||||
if(occupant.module)
|
||||
@@ -285,6 +310,6 @@
|
||||
if(istype(occupant.module.emag, /obj/item/weapon/reagent_containers/spray))
|
||||
var/obj/item/weapon/reagent_containers/spray/S = occupant.module.emag
|
||||
if(S.name == "polyacid spray")
|
||||
S.reagents.add_reagent("pacid", 2)
|
||||
S.reagents.add_reagent("pacid", 2 * coeff)
|
||||
else if(S.name == "lube spray")
|
||||
S.reagents.add_reagent("lube", 2)
|
||||
S.reagents.add_reagent("lube", 2 * coeff)
|
||||
|
||||
@@ -22,9 +22,9 @@
|
||||
..()
|
||||
|
||||
/obj/machinery/shield/Move()
|
||||
air_update_turf(1)
|
||||
var/turf/T = loc
|
||||
..()
|
||||
air_update_turf(1)
|
||||
move_update_air(T)
|
||||
|
||||
/obj/machinery/shield/CanPass(atom/movable/mover, turf/target, height, air_group)
|
||||
if(!height || air_group) return 0
|
||||
@@ -150,6 +150,7 @@
|
||||
var/list/deployed_shields = list()
|
||||
var/is_open = 0 //Whether or not the wires are exposed
|
||||
var/locked = 0
|
||||
var/shield_range = 4
|
||||
|
||||
/obj/machinery/shieldgen/Del()
|
||||
for(var/obj/machinery/shield/shield_tile in deployed_shields)
|
||||
@@ -163,7 +164,7 @@
|
||||
src.active = 1
|
||||
update_icon()
|
||||
|
||||
for(var/turf/target_tile in range(2, src))
|
||||
for(var/turf/target_tile in range(shield_range, src))
|
||||
if (istype(target_tile,/turf/space) && !(locate(/obj/machinery/shield) in target_tile))
|
||||
if (malfunction && prob(33) || !malfunction)
|
||||
deployed_shields += new /obj/machinery/shield(target_tile)
|
||||
@@ -176,6 +177,7 @@
|
||||
|
||||
for(var/obj/machinery/shield/shield_tile in deployed_shields)
|
||||
del(shield_tile)
|
||||
deployed_shields.Cut()
|
||||
|
||||
/obj/machinery/shieldgen/process()
|
||||
if(malfunction && active)
|
||||
@@ -332,7 +334,7 @@
|
||||
// var/maxshieldload = 200
|
||||
var/obj/structure/cable/attached // the attached cable
|
||||
var/storedpower = 0
|
||||
flags = FPRINT | CONDUCT
|
||||
flags = CONDUCT
|
||||
use_power = 0
|
||||
|
||||
/obj/machinery/shieldwallgen/proc/power()
|
||||
|
||||
@@ -11,8 +11,6 @@
|
||||
var/set_temperature = 50 // in celcius, add T0C for kelvin
|
||||
var/heating_power = 40000
|
||||
|
||||
flags = FPRINT
|
||||
|
||||
|
||||
New()
|
||||
..()
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
var/open_panel = 0 //are the wires exposed?
|
||||
var/active = 0 //is the bomb counting down?
|
||||
var/defused = 0 //is the bomb capable of exploding?
|
||||
var/degutted = 0 //is the bomb even a bomb anymore?
|
||||
var/obj/item/weapon/syndicatebombcore/payload
|
||||
|
||||
/obj/machinery/syndicatebomb/process()
|
||||
if(active && !defused && (timer > 0)) //Tick Tock
|
||||
@@ -24,15 +24,17 @@
|
||||
active = 0
|
||||
timer = 60
|
||||
processing_objects.Remove(src)
|
||||
explosion(src.loc,2,5,11, flame_range = 11)
|
||||
del(src)
|
||||
icon_state = "syndicate-bomb-inactive[open_panel ? "-wires" : ""]"
|
||||
if(payload in src)
|
||||
payload.detonate()
|
||||
return
|
||||
if(!active || defused) //Counter terrorists win
|
||||
processing_objects.Remove(src)
|
||||
return
|
||||
|
||||
/obj/machinery/syndicatebomb/New()
|
||||
wires = new(src)
|
||||
wires = new(src)
|
||||
payload = new(src)
|
||||
..()
|
||||
|
||||
|
||||
@@ -69,37 +71,34 @@
|
||||
user << "<span class='notice'>You [open_panel ? "open" : "close"] the wire panel.</span>"
|
||||
|
||||
else if(istype(I, /obj/item/weapon/wirecutters) || istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/assembly/signaler ))
|
||||
if(degutted)
|
||||
user << "<span class='notice'>The wires aren't connected to anything!<span>"
|
||||
else if(open_panel)
|
||||
if(open_panel)
|
||||
wires.Interact(user)
|
||||
|
||||
else if(istype(I, /obj/item/weapon/crowbar))
|
||||
if(open_panel && !degutted && isWireCut(WIRE_BOOM) && isWireCut(WIRE_UNBOLT) && isWireCut(WIRE_DELAY) && isWireCut(WIRE_PROCEED) && isWireCut(WIRE_ACTIVATE))
|
||||
user << "<span class='notice'>You carefully pry out the bomb's payload.</span>"
|
||||
degutted = 1
|
||||
new /obj/item/weapon/syndicatebombcore(user.loc)
|
||||
if(open_panel && isWireCut(WIRE_BOOM) && isWireCut(WIRE_UNBOLT) && isWireCut(WIRE_DELAY) && isWireCut(WIRE_PROCEED) && isWireCut(WIRE_ACTIVATE))
|
||||
if(payload)
|
||||
user << "<span class='notice'>You carefully pry out [payload].</span>"
|
||||
payload.loc = user.loc
|
||||
payload = null
|
||||
else
|
||||
user << "<span class='notice'>There isn't anything in here to remove!</span>"
|
||||
else if (open_panel)
|
||||
user << "<span class='notice'>The wires conneting the shell to the explosives are holding it down!</span>"
|
||||
else if (degutted)
|
||||
user << "<span class='notice'>The explosives have already been removed.</span>"
|
||||
else
|
||||
user << "<span class='notice'>The cover is screwed on, it won't pry off!</span>"
|
||||
else if(istype(I, /obj/item/weapon/syndicatebombcore))
|
||||
if(degutted)
|
||||
user << "<span class='notice'>You place the payload into the shell.</span>"
|
||||
degutted = 0
|
||||
if(!payload)
|
||||
payload = I
|
||||
user << "<span class='notice'>You place [payload] into [src].</span>"
|
||||
user.drop_item()
|
||||
del(I)
|
||||
payload.loc = src
|
||||
else
|
||||
user << "<span class='notice'>While a double strength bomb would surely be a thing of terrible beauty, there's just no room for it.</span>"
|
||||
user << "<span class='notice'>[payload] is already loaded into [src], you'll have to remove it first.</span>"
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/machinery/syndicatebomb/attack_hand(var/mob/user)
|
||||
if(degutted)
|
||||
user << "<span class='notice'>The bomb's explosives have been removed, the [open_panel ? "wires" : "buttons"] are useless now.</span>"
|
||||
else if(anchored)
|
||||
if(anchored)
|
||||
if(open_panel)
|
||||
wires.Interact(user)
|
||||
else if(!active)
|
||||
@@ -116,10 +115,8 @@
|
||||
timer = newtime
|
||||
src.loc.visible_message("\blue \icon[src] timer set for [timer] seconds.")
|
||||
if(alert(usr,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && in_range(src, usr) && isliving(usr))
|
||||
if(defused || active || degutted)
|
||||
if(degutted)
|
||||
src.loc.visible_message("\blue \icon[src] Device error: Payload missing")
|
||||
else if(defused)
|
||||
if(defused || active)
|
||||
if(defused)
|
||||
src.loc.visible_message("\blue \icon[src] Device error: User intervention required")
|
||||
return
|
||||
else
|
||||
@@ -147,12 +144,14 @@
|
||||
icon = 'icons/obj/assemblies.dmi'
|
||||
icon_state = "bombcore"
|
||||
item_state = "eshield0"
|
||||
flags = FPRINT | TABLEPASS
|
||||
w_class = 3.0
|
||||
origin_tech = "syndicate=6;combat=5"
|
||||
|
||||
/obj/item/weapon/syndicatebombcore/ex_act(severity) //Little boom can chain a big boom
|
||||
explosion(src.loc,2,5,11, flame_range = 11)
|
||||
src.detonate()
|
||||
|
||||
/obj/item/weapon/syndicatebombcore/proc/detonate()
|
||||
explosion(get_turf(src),2,5,11, flame_range = 11)
|
||||
del(src)
|
||||
|
||||
/obj/item/device/syndicatedetonator
|
||||
@@ -161,7 +160,6 @@
|
||||
icon = 'icons/obj/assemblies.dmi'
|
||||
icon_state = "bigred"
|
||||
item_state = "electronic"
|
||||
flags = FPRINT | TABLEPASS
|
||||
w_class = 1.0
|
||||
origin_tech = "syndicate=2"
|
||||
var/cooldown = 0
|
||||
|
||||
@@ -340,17 +340,17 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
|
||||
freq_text = "#unkn"
|
||||
if(COMM_FREQ)
|
||||
freq_text = "Command"
|
||||
if(1351)
|
||||
if(SCI_FREQ)
|
||||
freq_text = "Science"
|
||||
if(1355)
|
||||
if(MED_FREQ)
|
||||
freq_text = "Medical"
|
||||
if(1357)
|
||||
if(ENG_FREQ)
|
||||
freq_text = "Engineering"
|
||||
if(SEC_FREQ)
|
||||
freq_text = "Security"
|
||||
if(1349)
|
||||
if(SERV_FREQ)
|
||||
freq_text = "Service"
|
||||
if(1347)
|
||||
if(SUPP_FREQ)
|
||||
freq_text = "Supply"
|
||||
//There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO
|
||||
|
||||
@@ -372,11 +372,20 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
|
||||
part_a = "<span class='syndradio'><span class='name'>"
|
||||
else if (display_freq==COMM_FREQ)
|
||||
part_a = "<span class='comradio'><span class='name'>"
|
||||
else if (display_freq==SCI_FREQ)
|
||||
part_a = "<span class='sciradio'><span class='name'>"
|
||||
else if (display_freq==MED_FREQ)
|
||||
part_a = "<span class='medradio'><span class='name'>"
|
||||
else if (display_freq==ENG_FREQ)
|
||||
part_a = "<span class='engradio'><span class='name'>"
|
||||
else if (display_freq==SEC_FREQ)
|
||||
part_a = "<span class='secradio'><span class='name'>"
|
||||
else if (display_freq in DEPT_FREQS)
|
||||
part_a = "<span class='deptradio'><span class='name'>"
|
||||
|
||||
else if (display_freq==SERV_FREQ)
|
||||
part_a = "<span class='servradio'><span class='name'>"
|
||||
else if (display_freq==SUPP_FREQ)
|
||||
part_a = "<span class='suppradio'><span class='name'>"
|
||||
else if (display_freq==DSQUAD_FREQ)
|
||||
part_a = "<span class='dsquadradio'><span class='name'>"
|
||||
|
||||
// --- Filter the message; place it in quotes apply a verb ---
|
||||
|
||||
@@ -626,17 +635,17 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
|
||||
freq_text = "#unkn"
|
||||
if(COMM_FREQ)
|
||||
freq_text = "Command"
|
||||
if(1351)
|
||||
if(SCI_FREQ)
|
||||
freq_text = "Science"
|
||||
if(1355)
|
||||
if(MED_FREQ)
|
||||
freq_text = "Medical"
|
||||
if(1357)
|
||||
if(ENG_FREQ)
|
||||
freq_text = "Engineering"
|
||||
if(SEC_FREQ)
|
||||
freq_text = "Security"
|
||||
if(1349)
|
||||
if(SERV_FREQ)
|
||||
freq_text = "Service"
|
||||
if(1347)
|
||||
if(SUPP_FREQ)
|
||||
freq_text = "Supply"
|
||||
//There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO
|
||||
|
||||
@@ -662,10 +671,20 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
|
||||
part_a = "<span class='syndradio'><span class='name'>"
|
||||
else if (display_freq==COMM_FREQ)
|
||||
part_a = "<span class='comradio'><span class='name'>"
|
||||
else if (display_freq==SCI_FREQ)
|
||||
part_a = "<span class='sciradio'><span class='name'>"
|
||||
else if (display_freq==MED_FREQ)
|
||||
part_a = "<span class='medradio'><span class='name'>"
|
||||
else if (display_freq==ENG_FREQ)
|
||||
part_a = "<span class='engradio'><span class='name'>"
|
||||
else if (display_freq==SEC_FREQ)
|
||||
part_a = "<span class='secradio'><span class='name'>"
|
||||
else if (display_freq in DEPT_FREQS)
|
||||
part_a = "<span class='deptradio'><span class='name'>"
|
||||
else if (display_freq==SERV_FREQ)
|
||||
part_a = "<span class='servradio'><span class='name'>"
|
||||
else if (display_freq==SUPP_FREQ)
|
||||
part_a = "<span class='suppradio'><span class='name'>"
|
||||
else if (display_freq==DSQUAD_FREQ)
|
||||
part_a = "<span class='dsquadradio'><span class='name'>"
|
||||
|
||||
// --- This following recording is intended for research and feedback in the use of department radio channels ---
|
||||
|
||||
|
||||
@@ -606,12 +606,12 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
|
||||
|
||||
/obj/machinery/telecomms/server/proc/admin_log(var/mob/mob)
|
||||
|
||||
var/msg="[mob.name] has compiled a script to server [src]:"
|
||||
var/msg="[mob.real_name]/([mob.key]) has compiled a script to server [src]:"
|
||||
diary << msg
|
||||
diary << rawcode
|
||||
src.investigate_log("[msg]<br>[rawcode]", "ntsl")
|
||||
if(length(rawcode)) // Let's not bother the admins for empty code.
|
||||
message_admins("[mob.real_name] ([mob.key]) has compiled and uploaded a NTLS script to [src.id] ([mob.x],[mob.y],[mob.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[mob.x];Y=[mob.y];Z=[mob.z]'>JMP</a>)",0,1)
|
||||
message_admins("[mob.real_name]/([mob.key]) has compiled and uploaded a NTSL script to [src.id] ([mob.x],[mob.y],[mob.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[mob.x];Y=[mob.y];Z=[mob.z]'>JMP</a>)",0,1)
|
||||
|
||||
/obj/machinery/telecomms/server/proc/compile(var/mob/user)
|
||||
|
||||
|
||||
+133
-164
@@ -472,177 +472,146 @@
|
||||
//If he wants it back he can uncomment it
|
||||
|
||||
|
||||
/obj/structure/turret/gun_turret
|
||||
name = "gun turret"
|
||||
/obj/machinery/gun_turret //related to turrets but work way differentely because of being mounted on a moving ship.
|
||||
name = "machine gun turret"
|
||||
desc = "Syndicate defense turret. It really packs a bunch."
|
||||
density = 1
|
||||
anchored = 1
|
||||
var/cooldown = 20
|
||||
var/projectiles = 100
|
||||
var/projectiles_per_shot = 2
|
||||
var/deviation = 0.3
|
||||
var/list/exclude = list()
|
||||
var/atom/cur_target
|
||||
var/scan_range = 7
|
||||
var/health = 40
|
||||
var/list/scan_for = list("human"=0,"cyborg"=0,"mecha"=0,"alien"=1)
|
||||
var/on = 0
|
||||
var/state = 0 //Like stat on mobs, 0 is alive, 1 is damaged, 2 is dead
|
||||
var/faction = "syndicate"
|
||||
var/atom/cur_target = null
|
||||
var/scan_range = 9 //You will never see them coming
|
||||
var/health = 200 //Because it lacks a cover, and is mostly to keep people from touching the syndie shuttle.
|
||||
icon = 'icons/obj/turrets.dmi'
|
||||
icon_state = "gun_turret"
|
||||
icon_state = "syndieturret0"
|
||||
|
||||
/obj/machinery/gun_turret/New()
|
||||
..()
|
||||
take_damage(0) //check your health
|
||||
|
||||
/obj/machinery/gun_turret/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1)
|
||||
die()
|
||||
if(2)
|
||||
take_damage(100)
|
||||
if(3)
|
||||
take_damage(50)
|
||||
return
|
||||
|
||||
/obj/machinery/gun_turret/emp_act() //Can't emp an mechanical turret.
|
||||
return
|
||||
|
||||
/obj/machinery/gun_turret/meteorhit()
|
||||
die()
|
||||
return
|
||||
|
||||
/obj/machinery/gun_turret/update_icon()
|
||||
if(state > 2 || state < 0) //someone fucked up the vars so fix them
|
||||
take_damage(0)
|
||||
icon_state = "syndieturret" + "[state]"
|
||||
return
|
||||
|
||||
|
||||
ex_act()
|
||||
del src
|
||||
return
|
||||
|
||||
emp_act()
|
||||
del src
|
||||
return
|
||||
|
||||
meteorhit()
|
||||
del src
|
||||
return
|
||||
|
||||
proc/update_health()
|
||||
if(src.health<=0)
|
||||
del src
|
||||
return
|
||||
|
||||
proc/take_damage(damage)
|
||||
src.health -= damage
|
||||
if(src.health<=0)
|
||||
del src
|
||||
return
|
||||
|
||||
|
||||
bullet_act(var/obj/item/projectile/Proj)
|
||||
src.take_damage(Proj.damage)
|
||||
..()
|
||||
return
|
||||
|
||||
|
||||
attack_hand(mob/user as mob)
|
||||
user.set_machine(src)
|
||||
var/dat = {"<html>
|
||||
<head><title>[src] Control</title></head>
|
||||
<body>
|
||||
<b>Power: </b><a href='?src=\ref[src];power=1'>[on?"on":"off"]</a><br>
|
||||
<b>Scan Range: </b><a href='?src=\ref[src];scan_range=-1'>-</a> [scan_range] <a href='?src=\ref[src];scan_range=1'>+</a><br>
|
||||
<b>Scan for: </b>"}
|
||||
for(var/scan in scan_for)
|
||||
dat += "<div style=\"margin-left: 15px;\">[scan] (<a href='?src=\ref[src];scan_for=[scan]'>[scan_for[scan]?"Yes":"No"]</a>)</div>"
|
||||
|
||||
dat += {"<b>Ammo: </b>[max(0, projectiles)]<br>
|
||||
</body>
|
||||
</html>"}
|
||||
user << browse(dat, "window=turret")
|
||||
onclose(user, "turret")
|
||||
return
|
||||
|
||||
attack_ai(mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
|
||||
attack_alien(mob/user as mob)
|
||||
user.visible_message("[user] slashes at [src]", "You slash at [src]")
|
||||
src.take_damage(15)
|
||||
return
|
||||
|
||||
Topic(href, href_list)
|
||||
if(href_list["power"])
|
||||
src.on = !src.on
|
||||
if(src.on)
|
||||
spawn(50)
|
||||
if(src)
|
||||
src.process()
|
||||
if(href_list["scan_range"])
|
||||
src.scan_range = Clamp(src.scan_range+text2num(href_list["scan_range"]), 1, 8)
|
||||
if(href_list["scan_for"])
|
||||
if(href_list["scan_for"] in scan_for)
|
||||
scan_for[href_list["scan_for"]] = !scan_for[href_list["scan_for"]]
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
|
||||
|
||||
proc/validate_target(atom/target)
|
||||
if(get_dist(target, src)>scan_range)
|
||||
return 0
|
||||
if(istype(target, /mob))
|
||||
var/mob/M = target
|
||||
if(!M.stat && !M.lying)//ninjas can't catch you if you're lying
|
||||
return 1
|
||||
else if(istype(target, /obj/mecha))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
process()
|
||||
spawn while(on)
|
||||
if(projectiles<=0)
|
||||
on = 0
|
||||
/obj/machinery/gun_turret/proc/take_damage(damage)
|
||||
health -= damage
|
||||
switch(health)
|
||||
if(101 to INFINITY)
|
||||
state = 0
|
||||
if(1 to 100)
|
||||
state = 1
|
||||
if(-INFINITY to 0)
|
||||
if(state != 2)
|
||||
die()
|
||||
return
|
||||
if(cur_target && !validate_target(cur_target))
|
||||
cur_target = null
|
||||
if(!cur_target)
|
||||
cur_target = get_target()
|
||||
fire(cur_target)
|
||||
sleep(cooldown)
|
||||
state = 2
|
||||
update_icon()
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/gun_turret/bullet_act(var/obj/item/projectile/Proj)
|
||||
take_damage(Proj.damage)
|
||||
return
|
||||
|
||||
/obj/machinery/gun_turret/proc/die()
|
||||
state = 2
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/gun_turret/attack_hand(mob/user)
|
||||
return
|
||||
|
||||
/obj/machinery/gun_turret/attack_ai(mob/user)
|
||||
return attack_hand(user)
|
||||
|
||||
|
||||
/obj/machinery/gun_turret/attack_alien(mob/user as mob)
|
||||
user.visible_message("[user] slashes at [src]", "You slash at [src]")
|
||||
take_damage(15)
|
||||
return
|
||||
|
||||
/obj/machinery/gun_turret/proc/validate_target(atom/target)
|
||||
if(get_dist(target, src)>scan_range)
|
||||
return 0
|
||||
if(istype(target, /mob))
|
||||
var/mob/M = target
|
||||
if(!M.stat)
|
||||
return 1
|
||||
else if(istype(target, /obj/mecha))
|
||||
var/obj/mecha/M = target
|
||||
if(M.occupant)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
/obj/machinery/gun_turret/process()
|
||||
if(state == 2)
|
||||
return
|
||||
|
||||
proc/get_target()
|
||||
var/list/pos_targets = list()
|
||||
var/target = null
|
||||
if(scan_for["human"])
|
||||
for(var/mob/living/carbon/human/M in oview(scan_range,src))
|
||||
if(M.stat || M.lying || M in exclude)
|
||||
continue
|
||||
pos_targets += M
|
||||
if(scan_for["cyborg"])
|
||||
for(var/mob/living/silicon/M in oview(scan_range,src))
|
||||
if(M.stat || M.lying || M in exclude)
|
||||
continue
|
||||
pos_targets += M
|
||||
if(scan_for["mecha"])
|
||||
for(var/obj/mecha/M in oview(scan_range, src))
|
||||
if(M in exclude)
|
||||
continue
|
||||
pos_targets += M
|
||||
if(scan_for["alien"])
|
||||
for(var/mob/living/carbon/alien/M in oview(scan_range,src))
|
||||
if(M.stat || M.lying || M in exclude)
|
||||
continue
|
||||
pos_targets += M
|
||||
if(pos_targets.len)
|
||||
target = pick(pos_targets)
|
||||
return target
|
||||
if(cur_target && !validate_target(cur_target))
|
||||
cur_target = null
|
||||
if(!cur_target)
|
||||
cur_target = get_target()
|
||||
if(cur_target)
|
||||
fire(cur_target)
|
||||
return
|
||||
|
||||
|
||||
proc/fire(atom/target)
|
||||
if(!target)
|
||||
cur_target = null
|
||||
return
|
||||
src.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(-1)
|
||||
for(var/i=1 to min(projectiles, projectiles_per_shot))
|
||||
if(!src) break
|
||||
var/turf/curloc = get_turf(src)
|
||||
var/dx = round(gaussian(0,deviation),1)
|
||||
var/dy = round(gaussian(0,deviation),1)
|
||||
targloc = locate(target_x+dx, target_y+dy, 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()
|
||||
sleep(2)
|
||||
/obj/machinery/gun_turret/proc/get_target()
|
||||
var/list/pos_targets = list()
|
||||
var/target = null
|
||||
for(var/mob/living/M in view(scan_range,src))
|
||||
if(M.stat || faction == M.faction)
|
||||
continue
|
||||
pos_targets += M
|
||||
for(var/obj/mecha/M in oview(scan_range, src))
|
||||
if(M.occupant)
|
||||
if(faction == M.occupant.faction)
|
||||
continue
|
||||
if(!M.occupant)
|
||||
continue //Don't shoot at empty mechs.
|
||||
pos_targets += M
|
||||
if(pos_targets.len)
|
||||
target = pick(pos_targets)
|
||||
return target
|
||||
|
||||
|
||||
/obj/machinery/gun_turret/proc/fire(atom/target)
|
||||
if(!target)
|
||||
cur_target = null
|
||||
return
|
||||
src.dir = get_dir(src,target)
|
||||
var/turf/targloc = get_turf(target)
|
||||
if(!src)
|
||||
return
|
||||
var/turf/curloc = get_turf(src)
|
||||
if (!targloc || !curloc)
|
||||
return
|
||||
if (targloc == curloc)
|
||||
return
|
||||
playsound(src, 'sound/weapons/Gunshot.ogg', 50, 1)
|
||||
var/obj/item/projectile/A = new /obj/item/projectile/bullet(curloc)
|
||||
A.current = curloc
|
||||
A.yo = targloc.y - curloc.y
|
||||
A.xo = targloc.x - curloc.x
|
||||
spawn(0)
|
||||
A.process()
|
||||
return
|
||||
|
||||
@@ -266,9 +266,6 @@
|
||||
usr << "<span class='notice'>The vending machine refuses to interface with you, as you are not in its target demographic!</span>"
|
||||
return
|
||||
|
||||
if(panel_open)
|
||||
usr << "<span class='notice'>The vending machine cannot dispense products while its service panel is open!</span>"
|
||||
return
|
||||
if(href_list["remove_coin"])
|
||||
if(!coin)
|
||||
usr << "<span class='notice'>There is no coin in this machine.</span>"
|
||||
@@ -283,6 +280,9 @@
|
||||
|
||||
usr.set_machine(src)
|
||||
if((href_list["vend"]) && (vend_ready))
|
||||
if(panel_open)
|
||||
usr << "<span class='notice'>The vending machine cannot dispense products while its service panel is open!</span>"
|
||||
return
|
||||
|
||||
if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH
|
||||
usr << "<span class='warning'>Access denied.</span>" //Unless emagged of course
|
||||
@@ -678,7 +678,7 @@
|
||||
/obj/item/clothing/suit/wizrobe/fake = 1,/obj/item/clothing/head/wizard/fake = 1,/obj/item/weapon/staff = 3,/obj/item/clothing/mask/gas/sexyclown = 1,
|
||||
/obj/item/clothing/under/sexyclown = 1,/obj/item/clothing/mask/gas/sexymime = 1,/obj/item/clothing/under/sexymime = 1,/obj/item/clothing/suit/apron/overalls = 1,
|
||||
/obj/item/clothing/head/rabbitears =1) //Pretty much everything that had a chance to spawn.
|
||||
contraband = list(/obj/item/clothing/suit/cardborg = 1,/obj/item/clothing/head/cardborg = 1,/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1)
|
||||
contraband = list(/obj/item/clothing/suit/cardborg = 1,/obj/item/clothing/head/cardborg = 1,/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,/obj/item/weapon/gun/magic/wand = 1)
|
||||
premium = list(/obj/item/clothing/suit/hgpirate = 1, /obj/item/clothing/head/hgpiratecap = 1, /obj/item/clothing/head/helmet/roman = 1, /obj/item/clothing/head/helmet/roman/legionaire = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1, /obj/item/weapon/shield/riot/roman = 1)
|
||||
refill_canister = /obj/item/weapon/vending_refill/autodrobe
|
||||
|
||||
@@ -687,7 +687,7 @@
|
||||
desc = "A kitchen and restaurant equipment vendor"
|
||||
product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..."
|
||||
icon_state = "dinnerware"
|
||||
products = list(/obj/item/weapon/tray = 8,/obj/item/weapon/kitchen/utensil/fork = 6,/obj/item/weapon/kitchenknife = 3,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/chef/classic = 2)
|
||||
products = list(/obj/item/weapon/tray = 8,/obj/item/weapon/kitchen/utensil/fork = 6,/obj/item/weapon/kitchenknife = 3,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/chef/classic = 2,/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup = 5,/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce = 5)
|
||||
contraband = list(/obj/item/weapon/kitchen/rollingpin = 2, /obj/item/weapon/butch = 2)
|
||||
|
||||
/obj/machinery/vending/sovietsoda
|
||||
|
||||
@@ -24,13 +24,14 @@
|
||||
damage_absorption = list("brute"=0.6,"fire"=0.8,"bullet"=0.6,"laser"=0.5,"energy"=0.65,"bomb"=0.8)
|
||||
max_temperature = 35000
|
||||
overload_coeff = 1
|
||||
operation_req_access = list(access_syndicate)
|
||||
wreckage = /obj/structure/mecha_wreckage/gygax/dark
|
||||
max_equip = 4
|
||||
step_energy_drain = 5
|
||||
|
||||
/obj/mecha/combat/gygax/dark/loaded/New()
|
||||
..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang
|
||||
ME.attach(src)
|
||||
|
||||
@@ -42,9 +42,11 @@
|
||||
|
||||
/obj/mecha/combat/marauder/mauler/loaded/New()
|
||||
..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
|
||||
ME.attach(src)
|
||||
@@ -56,9 +58,9 @@
|
||||
|
||||
/obj/mecha/combat/marauder/loaded/New()
|
||||
..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
|
||||
ME.attach(src)
|
||||
|
||||
@@ -5,38 +5,40 @@
|
||||
var/projectile
|
||||
var/fire_sound
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/can_attach(var/obj/mecha/combat/M as obj)
|
||||
if(..())
|
||||
if(istype(M))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/action(atom/target)
|
||||
if(!action_checks(target)) return 0
|
||||
set_ready_state(0)
|
||||
var/turf/curloc = chassis.loc
|
||||
var/atom/targloc = get_turf(target)
|
||||
if (!targloc || !istype(targloc, /turf) || !curloc)
|
||||
return
|
||||
if (targloc == curloc)
|
||||
return
|
||||
playsound(chassis, fire_sound, 50, 1)
|
||||
var/obj/item/projectile/A = new projectile(curloc)
|
||||
A.firer = chassis.occupant
|
||||
A.original = target
|
||||
A.current = curloc
|
||||
A.yo = targloc.y - curloc.y
|
||||
A.xo = targloc.x - curloc.x
|
||||
A.process()
|
||||
chassis.log_message("Fired from [src.name], targeting [target].")
|
||||
do_after_cooldown()
|
||||
return 1
|
||||
|
||||
//Base energy weapon type
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy
|
||||
name = "general energy weapon"
|
||||
|
||||
action(target)
|
||||
if(!action_checks(target)) return
|
||||
var/turf/curloc = chassis.loc
|
||||
var/atom/targloc = get_turf(target)
|
||||
if (!targloc || !istype(targloc, /turf) || !curloc)
|
||||
return
|
||||
if (targloc == curloc)
|
||||
return
|
||||
set_ready_state(0)
|
||||
playsound(chassis, fire_sound, 50, 1)
|
||||
var/obj/item/projectile/A = new projectile(curloc)
|
||||
A.firer = chassis.occupant
|
||||
A.original = target
|
||||
A.current = curloc
|
||||
A.yo = targloc.y - curloc.y
|
||||
A.xo = targloc.x - curloc.x
|
||||
chassis.use_power(energy_drain)
|
||||
A.process()
|
||||
chassis.log_message("Fired from [src.name], targeting [target].")
|
||||
do_after_cooldown()
|
||||
return
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/action(atom/target)
|
||||
..()
|
||||
chassis.use_power(energy_drain)
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser
|
||||
@@ -107,86 +109,101 @@
|
||||
construction_time = 500
|
||||
construction_cost = list("metal"=20000,"bananium"=10000)
|
||||
|
||||
can_attach(obj/mecha/combat/honker/M as obj)
|
||||
if(..())
|
||||
if(istype(M))
|
||||
return 1
|
||||
return 0
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/honker/can_attach(obj/mecha/combat/honker/M as obj)
|
||||
if(..())
|
||||
if(istype(M))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
action(target)
|
||||
if(!chassis)
|
||||
return 0
|
||||
if(energy_drain && chassis.get_charge() < energy_drain)
|
||||
return 0
|
||||
if(!equip_ready)
|
||||
return 0
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/honker/action(target)
|
||||
if(!action_checks(target)) return 0
|
||||
set_ready_state(0)
|
||||
playsound(chassis, 'sound/items/AirHorn.ogg', 100, 1)
|
||||
chassis.occupant_message("<font color='red' size='5'>HONK</font>")
|
||||
for(var/mob/living/carbon/M in ohearers(6, chassis))
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(istype(H.ears, /obj/item/clothing/ears/earmuffs))
|
||||
continue
|
||||
M << "<font color='red' size='7'>HONK</font>"
|
||||
M.sleeping = 0
|
||||
M.stuttering += 20
|
||||
M.ear_deaf += 30
|
||||
M.Weaken(3)
|
||||
if(prob(30))
|
||||
M.Stun(10)
|
||||
M.Paralyse(4)
|
||||
else
|
||||
M.make_jittery(500)
|
||||
/* //else the mousetraps are useless
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(isobj(H.shoes))
|
||||
var/thingy = H.shoes
|
||||
H.drop_from_inventory(H.shoes)
|
||||
walk_away(thingy,chassis,15,2)
|
||||
spawn(20)
|
||||
if(thingy)
|
||||
walk(thingy,0)
|
||||
*/
|
||||
chassis.use_power(energy_drain)
|
||||
log_message("Honked from [src.name]. HONK!")
|
||||
var/turf/T = get_turf(src)
|
||||
message_admins("[key_name(chassis.occupant, chassis.occupant.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[chassis.occupant]'>?</A>) used a Mecha Honker in ([T.x],[T.y],[T.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)",0,1)
|
||||
log_game("[chassis.occupant.ckey]([chassis.occupant]) used a Mecha Honker in ([T.x],[T.y],[T.z])")
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
playsound(chassis, 'sound/items/AirHorn.ogg', 100, 1)
|
||||
chassis.occupant_message("<font color='red' size='5'>HONK</font>")
|
||||
for(var/mob/living/carbon/M in ohearers(6, chassis))
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(istype(H.ears, /obj/item/clothing/ears/earmuffs))
|
||||
continue
|
||||
M << "<font color='red' size='7'>HONK</font>"
|
||||
M.sleeping = 0
|
||||
M.stuttering += 20
|
||||
M.ear_deaf += 30
|
||||
M.Weaken(3)
|
||||
if(prob(30))
|
||||
M.Stun(10)
|
||||
M.Paralyse(4)
|
||||
else
|
||||
M.make_jittery(500)
|
||||
/* //else the mousetraps are useless
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(isobj(H.shoes))
|
||||
var/thingy = H.shoes
|
||||
H.drop_from_inventory(H.shoes)
|
||||
walk_away(thingy,chassis,15,2)
|
||||
spawn(20)
|
||||
if(thingy)
|
||||
walk(thingy,0)
|
||||
*/
|
||||
chassis.use_power(energy_drain)
|
||||
log_message("Honked from [src.name]. HONK!")
|
||||
var/turf/T = get_turf(src)
|
||||
message_admins("[key_name(chassis.occupant, chassis.occupant.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[chassis.occupant]'>?</A>) used a Mecha Honker in ([T.x],[T.y],[T.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)",0,1)
|
||||
log_game("[chassis.occupant.ckey]([chassis.occupant]) used a Mecha Honker in ([T.x],[T.y],[T.z])")
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
//Base ballistic weapon type
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic
|
||||
name = "general ballisic weapon"
|
||||
fire_sound = 'sound/weapons/Gunshot.ogg'
|
||||
var/projectiles
|
||||
var/projectile_energy_cost
|
||||
|
||||
action_checks(atom/target)
|
||||
if(..())
|
||||
if(projectiles > 0)
|
||||
return 1
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/action_checks(target)
|
||||
if(!..())
|
||||
return 0
|
||||
if(projectiles <= 0)
|
||||
return 0
|
||||
if(!equip_ready)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
get_equip_info()
|
||||
return "[..()]\[[src.projectiles]\][(src.projectiles < initial(src.projectiles))?" - <a href='?src=\ref[src];rearm=1'>Rearm</a>":null]"
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/get_equip_info()
|
||||
return "[..()]\[[src.projectiles]\][(src.projectiles < initial(src.projectiles))?" - <a href='?src=\ref[src];rearm=1'>Rearm</a>":null]"
|
||||
|
||||
proc/rearm()
|
||||
if(projectiles < initial(projectiles))
|
||||
var/projectiles_to_add = initial(projectiles) - projectiles
|
||||
while(chassis.get_charge() >= projectile_energy_cost && projectiles_to_add)
|
||||
projectiles++
|
||||
projectiles_to_add--
|
||||
chassis.use_power(projectile_energy_cost)
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/proc/rearm()
|
||||
if(projectiles < initial(projectiles))
|
||||
var/projectiles_to_add = initial(projectiles) - projectiles
|
||||
while(chassis.get_charge() >= projectile_energy_cost && projectiles_to_add)
|
||||
projectiles++
|
||||
projectiles_to_add--
|
||||
chassis.use_power(projectile_energy_cost)
|
||||
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
|
||||
log_message("Rearmed [src.name].")
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/Topic(href, href_list)
|
||||
..()
|
||||
if (href_list["rearm"])
|
||||
src.rearm()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/action(atom/target)
|
||||
if(..())
|
||||
src.projectiles--
|
||||
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
|
||||
log_message("Rearmed [src.name].")
|
||||
return
|
||||
|
||||
Topic(href, href_list)
|
||||
..()
|
||||
if (href_list["rearm"])
|
||||
src.rearm()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine
|
||||
name = "\improper FNX-66 Carbine"
|
||||
icon_state = "mecha_carbine"
|
||||
equip_cooldown = 5
|
||||
projectile = /obj/item/projectile/bullet/incendiary
|
||||
projectiles = 24
|
||||
projectile_energy_cost = 15
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot
|
||||
@@ -194,7 +211,6 @@
|
||||
icon_state = "mecha_scatter"
|
||||
equip_cooldown = 20
|
||||
projectile = /obj/item/projectile/bullet/midbullet
|
||||
fire_sound = 'sound/weapons/Gunshot.ogg'
|
||||
projectiles = 40
|
||||
projectile_energy_cost = 25
|
||||
var/projectiles_per_shot = 4
|
||||
@@ -236,7 +252,6 @@
|
||||
icon_state = "mecha_uac2"
|
||||
equip_cooldown = 10
|
||||
projectile = /obj/item/projectile/bullet/weakbullet
|
||||
fire_sound = 'sound/weapons/Gunshot.ogg'
|
||||
projectiles = 300
|
||||
projectile_energy_cost = 20
|
||||
var/projectiles_per_shot = 3
|
||||
@@ -279,7 +294,7 @@
|
||||
name = "\improper SRM-8 missile rack"
|
||||
icon_state = "mecha_missilerack"
|
||||
projectile = /obj/item/missile
|
||||
fire_sound = 'sound/effects/bang.ogg'
|
||||
fire_sound = 'sound/weapons/grenadelaunch.ogg'
|
||||
projectiles = 8
|
||||
projectile_energy_cost = 1000
|
||||
equip_cooldown = 60
|
||||
@@ -320,7 +335,7 @@
|
||||
name = "\improper SGL-6 grenade launcher"
|
||||
icon_state = "mecha_grenadelnchr"
|
||||
projectile = /obj/item/weapon/grenade/flashbang
|
||||
fire_sound = 'sound/effects/bang.ogg'
|
||||
fire_sound = 'sound/weapons/grenadelaunch.ogg'
|
||||
projectiles = 6
|
||||
missile_speed = 1.5
|
||||
projectile_energy_cost = 800
|
||||
|
||||
@@ -133,12 +133,12 @@
|
||||
/obj/machinery/mecha_part_fabricator/New()
|
||||
..()
|
||||
component_parts = list()
|
||||
component_parts += new /obj/item/weapon/circuitboard/mechfab(src)
|
||||
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
|
||||
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
|
||||
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
|
||||
component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
|
||||
component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
|
||||
component_parts += new /obj/item/weapon/circuitboard/mechfab(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
|
||||
RefreshParts()
|
||||
|
||||
// part_sets["Cyborg Upgrade Modules"] = typesof(/obj/item/borg/upgrade/) - /obj/item/borg/upgrade/ // Eh. This does it dymaically, but to support having the items referenced otherwhere in the code but not being constructable, going to do it manaully.
|
||||
@@ -162,18 +162,16 @@
|
||||
T = 0
|
||||
for(var/obj/item/weapon/stock_parts/micro_laser/Ma in component_parts)
|
||||
T += Ma.rating
|
||||
if(T >= 1)
|
||||
T -= 1
|
||||
T -= 1
|
||||
var/diff
|
||||
diff = round(initial(resource_coeff) - (initial(resource_coeff)*(T))/25,0.01)
|
||||
diff = round(initial(resource_coeff) - (initial(resource_coeff)*(T))/6,0.01)
|
||||
if(resource_coeff!=diff)
|
||||
resource_coeff = diff
|
||||
T = 0
|
||||
for(var/obj/item/weapon/stock_parts/manipulator/Ml in component_parts)
|
||||
T += Ml.rating
|
||||
if(T>= 2)
|
||||
T -= 2
|
||||
diff = round(initial(time_coeff) - (initial(time_coeff)*(T))/25,0.01)
|
||||
T -= 1
|
||||
diff = round(initial(time_coeff) - (initial(time_coeff)*(T))/4,0.01)
|
||||
if(time_coeff!=diff)
|
||||
time_coeff = diff
|
||||
|
||||
@@ -358,6 +356,8 @@
|
||||
src.being_built = new part.type(src)
|
||||
src.desc = "It's building [src.being_built]."
|
||||
src.remove_resources(part)
|
||||
part.m_amt = get_resource_cost_w_coeff(part,"metal")
|
||||
part.g_amt = get_resource_cost_w_coeff(part,"glass")
|
||||
src.overlays += "fab-active"
|
||||
src.use_power = 2
|
||||
src.updateUsrDialog()
|
||||
@@ -447,10 +447,10 @@
|
||||
for(var/datum/design/D in files.known_designs)
|
||||
if(D.build_type&16)
|
||||
if(D.category in part_sets)//Checks if it's a valid category
|
||||
if(add_part_to_set(D.category, text2path(D.build_path)))//Adds it to said category
|
||||
if(add_part_to_set(D.category, D.build_path))//Adds it to said category
|
||||
i++
|
||||
else
|
||||
if(add_part_to_set("Misc", text2path(D.build_path)))//If in doubt, chunk it into the Misc
|
||||
if(add_part_to_set("Misc", D.build_path))//If in doubt, chunk it into the Misc
|
||||
i++
|
||||
return i
|
||||
|
||||
@@ -514,7 +514,7 @@
|
||||
temp += "<a href='?src=\ref[src];clear_temp=1'>Return</a>"
|
||||
src.updateUsrDialog()
|
||||
if(i || tech_output)
|
||||
src.visible_message("\icon[src] <b>[src]</b> beeps, \"Succesfully synchronized with R&D server. New data processed.\"")
|
||||
src.visible_message("\icon[src] <b>[src]</b> beeps, \"Successfully synchronized with R&D server. New data processed.\"")
|
||||
if(!silent && !found)
|
||||
temp = "Unable to connect to local R&D Database.<br>Please check your connections and try again.<br><a href='?src=\ref[src];clear_temp=1'>Return</a>"
|
||||
src.updateUsrDialog()
|
||||
@@ -581,10 +581,10 @@
|
||||
<body>
|
||||
<table style='width: 100%;'>
|
||||
<tr>
|
||||
<td style='width: 70%; padding-right: 10px;'>
|
||||
<td style='width: 65%; padding-right: 10px;'>
|
||||
[left_part]
|
||||
</td>
|
||||
<td style='width: 30%; background: #ccc;' id='queue'>
|
||||
<td style='width: 35%; background: #ccc;' id='queue'>
|
||||
[list_queue()]
|
||||
</td>
|
||||
<tr>
|
||||
|
||||
@@ -236,7 +236,7 @@
|
||||
target = safepick(view(3,target))
|
||||
if(!target)
|
||||
return
|
||||
if(get_dist(src, target)>1)
|
||||
if(!target.Adjacent(src))
|
||||
if(selected && selected.is_ranged())
|
||||
selected.action(target)
|
||||
else if(selected && selected.is_melee())
|
||||
@@ -988,7 +988,7 @@
|
||||
H.forceMove(src)
|
||||
if(H.hud_used)
|
||||
last_user_hud = H.hud_used.hud_shown
|
||||
H.hud_used.hide_hud()
|
||||
H.hud_used.show_hud(1)
|
||||
|
||||
src.occupant = H
|
||||
src.add_fingerprint(H)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
icon = 'icons/mecha/mech_construct.dmi'
|
||||
icon_state = "blank"
|
||||
w_class = 20
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
flags = CONDUCT
|
||||
origin_tech = "programming=2;materials=2"
|
||||
var/construction_time = 100
|
||||
var/list/construction_cost = list("metal"=20000,"glass"=5000)
|
||||
@@ -18,7 +18,6 @@
|
||||
icon_state = "backbone"
|
||||
var/datum/construction/construct
|
||||
construction_cost = list("metal"=20000)
|
||||
flags = FPRINT | CONDUCT
|
||||
|
||||
attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(!construct || !construct.action(W, user))
|
||||
@@ -405,7 +404,7 @@
|
||||
icon_state = "std_mod"
|
||||
item_state = "electronic"
|
||||
board_type = "other"
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
flags = CONDUCT
|
||||
force = 5.0
|
||||
w_class = 2.0
|
||||
throwforce = 5.0
|
||||
|
||||
@@ -35,10 +35,9 @@
|
||||
return
|
||||
|
||||
/obj/structure/alien/resin/Move()
|
||||
air_update_turf(1)
|
||||
var/turf/T = loc
|
||||
..()
|
||||
air_update_turf(1)
|
||||
return
|
||||
move_update_air(T)
|
||||
|
||||
/obj/structure/alien/resin/CanAtmosPass()
|
||||
return !density
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
//########################## CONTRABAND ;3333333333333333333 -Agouri ###################################################
|
||||
|
||||
#define NUM_OF_POSTER_DESIGNS 11
|
||||
#define NUM_OF_POSTER_DESIGNS 21
|
||||
|
||||
/obj/item/weapon/contraband
|
||||
name = "contraband item"
|
||||
@@ -116,6 +116,36 @@ obj/structure/sign/poster/New(serial)
|
||||
if(11)
|
||||
name += " - RIP Badger"
|
||||
desc += " This poster commemorates the day hundreds of badgers worldwide were sacrificed for the greater good."
|
||||
if(12)
|
||||
name += " - Ambrosia Vulgaris"
|
||||
desc += " This poster is lookin' pretty trippy man."
|
||||
if(13)
|
||||
name += " - Donut Corp."
|
||||
desc += " This poster is an advertisement for Donut Corp."
|
||||
if(14)
|
||||
name += " - EAT"
|
||||
desc += " This poster is advising that you eat."
|
||||
if(15)
|
||||
name += " - Tools"
|
||||
desc += " This poster is an advertisement for tools."
|
||||
if(16)
|
||||
name += " - Power"
|
||||
desc += " A poster all about power."
|
||||
if(17)
|
||||
name += " - Power to the People"
|
||||
desc += " Screw those EDF guys!"
|
||||
if(18)
|
||||
name += " - Communist state"
|
||||
desc += " All hail the Communist party!"
|
||||
if(19)
|
||||
name += " - Lamarr"
|
||||
desc += " This poster depicts Lamarr. Probably made by the research director."
|
||||
if(20)
|
||||
name += " - Borg Fancy"
|
||||
desc += " Being fancy can be for any borg, Just need a suit."
|
||||
if(21)
|
||||
name += " - Borg Fancy v2"
|
||||
desc += " Borg Fancy, Now only taking the most fancy."
|
||||
else
|
||||
name = "This shit just bugged. Report it to Agouri - polyxenitopalidou@gmail.com"
|
||||
desc = "Why are you still here?"
|
||||
|
||||
@@ -11,14 +11,12 @@ would spawn and follow the beaker, even if it is carried or thrown.
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
mouse_opacity = 0
|
||||
unacidable = 1//So effect are not targeted by alien acid.
|
||||
flags = TABLEPASS
|
||||
|
||||
/obj/effect/effect/water
|
||||
name = "water"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "extinguish"
|
||||
var/life = 15.0
|
||||
flags = TABLEPASS
|
||||
mouse_opacity = 0
|
||||
|
||||
/obj/effect/effect/smoke
|
||||
@@ -845,15 +843,8 @@ steam.start() -- spawns the effect
|
||||
return
|
||||
|
||||
if (istype(AM, /mob/living/carbon))
|
||||
var/mob/M = AM
|
||||
if (istype(M, /mob/living/carbon/human) && (istype(M:shoes, /obj/item/clothing/shoes) && M:shoes.flags&NOSLIP))
|
||||
return
|
||||
|
||||
M.stop_pulling()
|
||||
M << "\blue You slipped on the foam!"
|
||||
playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3)
|
||||
M.Stun(5)
|
||||
M.Weaken(2)
|
||||
var/mob/living/carbon/M = AM
|
||||
M.slip(5, 2, src)
|
||||
|
||||
|
||||
/datum/effect/effect/system/foam_spread
|
||||
@@ -930,9 +921,9 @@ steam.start() -- spawns the effect
|
||||
..()
|
||||
|
||||
Move()
|
||||
air_update_turf(1)
|
||||
var/turf/T = loc
|
||||
..()
|
||||
air_update_turf(1)
|
||||
move_update_air(T)
|
||||
|
||||
proc/updateicon()
|
||||
if(metal == 1)
|
||||
|
||||
@@ -109,20 +109,14 @@
|
||||
/obj/effect/landmark/costume/nyangirl/New()
|
||||
new /obj/item/clothing/under/schoolgirl(src.loc)
|
||||
new /obj/item/clothing/head/kitty(src.loc)
|
||||
if (prob(50))
|
||||
new /obj/item/clothing/glasses/sunglasses/blindfold(src.loc)
|
||||
else
|
||||
new /obj/item/clothing/mask/muzzle/gag(src.loc)
|
||||
new /obj/item/clothing/glasses/sunglasses/blindfold(src.loc)
|
||||
del(src)
|
||||
|
||||
/obj/effect/landmark/costume/maid/New()
|
||||
new /obj/item/clothing/under/blackskirt(src.loc)
|
||||
var/CHOICE = pick( /obj/item/clothing/head/beret , /obj/item/clothing/head/rabbitears )
|
||||
new CHOICE(src.loc)
|
||||
if (prob(50))
|
||||
new /obj/item/clothing/glasses/sunglasses/blindfold(src.loc)
|
||||
else
|
||||
new /obj/item/clothing/mask/muzzle/gag(src.loc)
|
||||
new /obj/item/clothing/glasses/sunglasses/blindfold(src.loc)
|
||||
del(src)
|
||||
|
||||
/obj/effect/landmark/costume/butler/New()
|
||||
|
||||
@@ -7,6 +7,19 @@
|
||||
else return dy + (0.5*dx)
|
||||
|
||||
|
||||
proc/trange(var/Dist=0,var/turf/Center=null)//alternative to range (ONLY processes turfs and thus less intensive)
|
||||
if(Center==null) return
|
||||
|
||||
//var/x1=((Center.x-Dist)<1 ? 1 : Center.x-Dist)
|
||||
//var/y1=((Center.y-Dist)<1 ? 1 : Center.y-Dist)
|
||||
//var/x2=((Center.x+Dist)>world.maxx ? world.maxx : Center.x+Dist)
|
||||
//var/y2=((Center.y+Dist)>world.maxy ? world.maxy : Center.y+Dist)
|
||||
|
||||
var/turf/x1y1 = locate(((Center.x-Dist)<1 ? 1 : Center.x-Dist),((Center.y-Dist)<1 ? 1 : Center.y-Dist),Center.z)
|
||||
var/turf/x2y2 = locate(((Center.x+Dist)>world.maxx ? world.maxx : Center.x+Dist),((Center.y+Dist)>world.maxy ? world.maxy : Center.y+Dist),Center.z)
|
||||
return block(x1y1,x2y2)
|
||||
|
||||
|
||||
proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0)
|
||||
src = null //so we don't abort once src is deleted
|
||||
epicenter = get_turf(epicenter)
|
||||
@@ -86,7 +99,8 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
|
||||
var/y0 = epicenter.y
|
||||
var/z0 = epicenter.z
|
||||
|
||||
for(var/turf/T in range(epicenter, max_range))
|
||||
for(var/turf/T in trange(max_range, epicenter))
|
||||
|
||||
var/dist = cheap_pythag(T.x - x0,T.y - y0)
|
||||
var/flame_dist = 0
|
||||
var/hotspot_exists
|
||||
@@ -100,15 +114,19 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
|
||||
else dist = 0
|
||||
|
||||
|
||||
//------- TURF FIRES -------\\
|
||||
//------- TURF FIRES -------
|
||||
|
||||
if(T)
|
||||
if(flame_dist && prob(40) && !istype(T, /turf/space))
|
||||
new/obj/effect/hotspot(T) //Mostly for ambience!
|
||||
spawn()
|
||||
new/obj/effect/hotspot(T) //Mostly for ambience!
|
||||
hotspot_exists = 1
|
||||
if(dist)
|
||||
T.ex_act(dist)
|
||||
spawn()
|
||||
if(T)
|
||||
T.ex_act(dist)
|
||||
|
||||
//------- THINGS IN TURFS FIRES -------\\
|
||||
//------- THINGS IN TURFS FIRES -------
|
||||
|
||||
for(var/atom_movable in T.contents) //bypass type checking since only atom/movable can be contained by turfs anyway
|
||||
var/atom/movable/AM = atom_movable
|
||||
@@ -116,10 +134,14 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
|
||||
if(AM) //Something is inside T (We have already checked T exists above) - RR
|
||||
if(flame_dist) //if it has flame distance, run this - RR
|
||||
if(isliving(AM) && !hotspot_exists && !istype(T, /turf/space))
|
||||
new /obj/effect/hotspot(AM.loc)
|
||||
spawn()
|
||||
if(AM && AM.loc!=null)
|
||||
new /obj/effect/hotspot(AM.loc)
|
||||
//Just in case we missed a mob while they were in flame_range, but a hotspot didn't spawn on them, otherwise it looks weird when you just burst into flame out of nowhere
|
||||
if(dist) //if no flame_dist, run this - RR
|
||||
AM.ex_act(dist)
|
||||
spawn()
|
||||
if(AM)
|
||||
AM.ex_act(dist)
|
||||
|
||||
|
||||
|
||||
@@ -145,5 +167,5 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
|
||||
|
||||
|
||||
proc/secondaryexplosion(turf/epicenter, range)
|
||||
for(var/turf/tile in range(range, epicenter))
|
||||
for(var/turf/tile in trange(range, epicenter))
|
||||
tile.ex_act(2)
|
||||
@@ -9,31 +9,12 @@
|
||||
/obj
|
||||
var/explosion_resistance
|
||||
|
||||
/datum/explosion_turf
|
||||
var/turf/turf //The turf which will get ex_act called on it
|
||||
var/max_power //The largest amount of power the turf sustained
|
||||
|
||||
New()
|
||||
..()
|
||||
max_power = 0
|
||||
|
||||
proc/save_power_if_larger(power)
|
||||
if(power > max_power)
|
||||
max_power = power
|
||||
return 1
|
||||
return 0
|
||||
var/list/explosion_turfs = list()
|
||||
|
||||
var/list/datum/explosion_turf/explosion_turfs = list()
|
||||
var/explosion_in_progress = 0
|
||||
|
||||
proc/get_explosion_turf(var/turf/T)
|
||||
for( var/datum/explosion_turf/ET in explosion_turfs )
|
||||
if( T == ET.turf )
|
||||
return ET
|
||||
var/datum/explosion_turf/ET = new()
|
||||
ET.turf = T
|
||||
explosion_turfs += ET
|
||||
return ET
|
||||
|
||||
proc/explosion_rec(turf/epicenter, power)
|
||||
|
||||
@@ -55,9 +36,8 @@ proc/explosion_rec(turf/epicenter, power)
|
||||
|
||||
explosion_in_progress = 1
|
||||
explosion_turfs = list()
|
||||
var/datum/explosion_turf/ETE = get_explosion_turf()
|
||||
ETE.turf = epicenter
|
||||
ETE.max_power = power
|
||||
|
||||
explosion_turfs[epicenter] = power
|
||||
|
||||
//This steap handles the gathering of turfs which will be ex_act() -ed in the next step. It also ensures each turf gets the maximum possible amount of power dealt to it.
|
||||
for(var/direction in cardinal)
|
||||
@@ -65,22 +45,21 @@ proc/explosion_rec(turf/epicenter, power)
|
||||
T.explosion_spread(power - epicenter.explosion_resistance, direction)
|
||||
|
||||
//This step applies the ex_act effects for the explosion, as planned in the previous step.
|
||||
for( var/datum/explosion_turf/ET in explosion_turfs )
|
||||
if(ET.max_power <= 0) continue
|
||||
if(!ET.turf) continue
|
||||
for(var/turf/T in explosion_turfs)
|
||||
if(explosion_turfs[T] <= 0) continue
|
||||
if(!T) continue
|
||||
|
||||
//Wow severity looks confusing to calculate... Fret not, I didn't leave you with any additional instructions or help. (just kidding, see the line under the calculation)
|
||||
var/severity = 4 - round(max(min( 3, ((ET.max_power - ET.turf.explosion_resistance) / (max(3,(power/3)))) ) ,1), 1)
|
||||
//sanity effective power on tile divided by either 3 or one third the total explosion power
|
||||
var/severity = 4 - round(max(min( 3, ((explosion_turfs[T] - T.explosion_resistance) / (max(3,(power/3)))) ) ,1), 1) //sanity effective power on tile divided by either 3 or one third the total explosion power
|
||||
// One third because there are three power levels and I
|
||||
// want each one to take up a third of the crater
|
||||
var/x = ET.turf.x
|
||||
var/y = ET.turf.y
|
||||
var/z = ET.turf.z
|
||||
ET.turf.ex_act(severity)
|
||||
if(!ET.turf)
|
||||
ET.turf = locate(x,y,z)
|
||||
for( var/atom/A in ET.turf )
|
||||
var/x = T.x
|
||||
var/y = T.y
|
||||
var/z = T.z
|
||||
T.ex_act(severity)
|
||||
if(!T)
|
||||
T = locate(x,y,z)
|
||||
for(var/atom/A in T)
|
||||
A.ex_act(severity)
|
||||
|
||||
explosion_in_progress = 0
|
||||
@@ -126,10 +105,9 @@ proc/explosion_rec(turf/epicenter, power)
|
||||
new/obj/effect/debugging/marker(src)
|
||||
*/
|
||||
|
||||
var/datum/explosion_turf/ET = get_explosion_turf(src)
|
||||
if(ET.max_power >= power)
|
||||
if(explosion_turfs[src] >= power)
|
||||
return //The turf already sustained and spread a power greated than what we are dealing with. No point spreading again.
|
||||
ET.max_power = power
|
||||
explosion_turfs[src] = power
|
||||
|
||||
var/spread_power = power - src.explosion_resistance //This is the amount of power that will be spread to the tile in the direction of the blast
|
||||
var/side_spread_power = power - 2 * src.explosion_resistance //This is the amount of power that will be spread to the side tiles
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
var/burning = null
|
||||
var/hitsound = null
|
||||
var/w_class = 3.0
|
||||
flags = FPRINT | TABLEPASS
|
||||
var/slot_flags = 0 //This is used to determine on which slots an item can fit.
|
||||
pass_flags = PASSTABLE
|
||||
pressure_resistance = 5
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
desc = "Used for repairing or building APCs"
|
||||
icon = 'icons/obj/apc_repair.dmi'
|
||||
icon_state = "apc_frame"
|
||||
flags = FPRINT | TABLEPASS| CONDUCT
|
||||
flags = CONDUCT
|
||||
|
||||
/obj/item/apc_frame/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
..()
|
||||
|
||||
@@ -11,7 +11,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
|
||||
icon_state = "pda"
|
||||
item_state = "electronic"
|
||||
w_class = 1.0
|
||||
flags = FPRINT | TABLEPASS
|
||||
slot_flags = SLOT_ID | SLOT_BELT
|
||||
|
||||
//Main variables
|
||||
@@ -960,20 +959,13 @@ var/global/list/obj/item/device/pda/PDAs = list()
|
||||
|
||||
/obj/item/device/pda/clown/Crossed(AM as mob|obj) //Clown PDA is slippery.
|
||||
if (istype(AM, /mob/living/carbon))
|
||||
var/mob/M = AM
|
||||
if ((istype(M, /mob/living/carbon/human) && (istype(M:shoes, /obj/item/clothing/shoes) && M:shoes.flags&NOSLIP)) || M.m_intent == "walk")
|
||||
return
|
||||
|
||||
if ((istype(M, /mob/living/carbon/human) && (M.real_name != src.owner) && (istype(src.cartridge, /obj/item/weapon/cartridge/clown))))
|
||||
if (src.cartridge:honk_charges < 5)
|
||||
src.cartridge:honk_charges++
|
||||
|
||||
M.stop_pulling()
|
||||
M << "\blue You slipped on the PDA!"
|
||||
playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3)
|
||||
M.Stun(8)
|
||||
M.Weaken(5)
|
||||
|
||||
var/mob/living/carbon/M = AM
|
||||
if(M.slip(8, 5, src, NO_SLIP_WHEN_WALKING))
|
||||
if (ishuman(M) && (M.real_name != src.owner))
|
||||
if (istype(src.cartridge, /obj/item/weapon/cartridge/clown))
|
||||
var/obj/item/weapon/cartridge/clown/cart = src.cartridge
|
||||
if(cart.honk_charges < 5)
|
||||
cart.honk_charges++
|
||||
|
||||
//AI verb and proc for sending PDA messages.
|
||||
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
icon_state = "aicard" // aicard-full
|
||||
item_state = "electronic"
|
||||
w_class = 2.0
|
||||
flags = FPRINT | TABLEPASS
|
||||
slot_flags = SLOT_BELT
|
||||
var/flush = null
|
||||
origin_tech = "programming=4;materials=4"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/item/device/chameleon
|
||||
name = "chameleon-projector"
|
||||
icon_state = "shield0"
|
||||
flags = FPRINT | TABLEPASS| CONDUCT
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
item_state = "electronic"
|
||||
throwforce = 5.0
|
||||
@@ -12,6 +12,9 @@
|
||||
var/can_use = 1
|
||||
var/obj/effect/dummy/chameleon/active_dummy = null
|
||||
var/saved_item = /obj/item/weapon/cigbutt
|
||||
var/saved_icon = 'icons/obj/clothing/masks.dmi'
|
||||
var/saved_icon_state = "cigbutt"
|
||||
var/saved_overlays
|
||||
|
||||
/obj/item/device/chameleon/dropped()
|
||||
disrupt()
|
||||
@@ -29,6 +32,9 @@
|
||||
playsound(get_turf(src), 'sound/weapons/flash.ogg', 100, 1, -6)
|
||||
user << "\blue Scanned [target]."
|
||||
saved_item = target.type
|
||||
saved_icon = target.icon
|
||||
saved_icon_state = target.icon_state
|
||||
saved_overlays = target.overlays
|
||||
|
||||
/obj/item/device/chameleon/proc/toggle()
|
||||
if(!can_use || !saved_item) return
|
||||
@@ -47,7 +53,7 @@
|
||||
var/obj/O = new saved_item(src)
|
||||
if(!O) return
|
||||
var/obj/effect/dummy/chameleon/C = new/obj/effect/dummy/chameleon(usr.loc)
|
||||
C.activate(O, usr, src)
|
||||
C.activate(O, usr, saved_icon, saved_icon_state, saved_overlays, src)
|
||||
del(O)
|
||||
usr << "\blue You activate the [src]."
|
||||
var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src))
|
||||
@@ -83,11 +89,12 @@
|
||||
var/can_move = 1
|
||||
var/obj/item/device/chameleon/master = null
|
||||
|
||||
/obj/effect/dummy/chameleon/proc/activate(var/obj/item/O, var/mob/M, var/obj/item/device/chameleon/C)
|
||||
/obj/effect/dummy/chameleon/proc/activate(var/obj/O, var/mob/M, new_icon, new_iconstate, new_overlays, var/obj/item/device/chameleon/C)
|
||||
name = O.name
|
||||
desc = O.desc
|
||||
icon = O.icon
|
||||
icon_state = O.icon_state
|
||||
icon = new_icon
|
||||
icon_state = new_iconstate
|
||||
overlays = new_overlays
|
||||
dir = O.dir
|
||||
M.loc = src
|
||||
master = C
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
w_class = 1.0
|
||||
throw_speed = 4
|
||||
throw_range = 10
|
||||
flags = FPRINT | TABLEPASS| CONDUCT
|
||||
flags = CONDUCT
|
||||
origin_tech = "magnets=2;combat=1"
|
||||
|
||||
var/times_used = 0 //Number of times it's been used.
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
icon_state = "flashlight"
|
||||
item_state = "flashlight"
|
||||
w_class = 2
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
m_amt = 50
|
||||
g_amt = 20
|
||||
@@ -104,7 +104,7 @@
|
||||
desc = "A pen-sized light, used by medical staff."
|
||||
icon_state = "penlight"
|
||||
item_state = ""
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
flags = CONDUCT
|
||||
brightness_on = 2
|
||||
|
||||
|
||||
@@ -116,7 +116,7 @@
|
||||
item_state = "lamp"
|
||||
brightness_on = 5
|
||||
w_class = 4
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
flags = CONDUCT
|
||||
m_amt = 0
|
||||
g_amt = 0
|
||||
on = 1
|
||||
@@ -205,7 +205,6 @@
|
||||
icon_state = "slime"
|
||||
item_state = "slime"
|
||||
w_class = 2
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
m_amt = 0
|
||||
g_amt = 0
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
icon_state = "pointer"
|
||||
item_state = "pen"
|
||||
var/pointer_icon_state
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
m_amt = 500
|
||||
g_amt = 500
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user