diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm new file mode 100644 index 0000000000..9de878cb4c --- /dev/null +++ b/code/modules/projectiles/projectile/energy.dm @@ -0,0 +1,203 @@ +/obj/item/projectile/energy + name = "energy" + icon_state = "spark" + damage = 0 + damage_type = BURN + flag = "energy" + is_reflectable = TRUE + +/obj/item/projectile/energy/chameleon + nodamage = TRUE + +/obj/item/projectile/energy/electrode + name = "electrode" + icon_state = "spark" + color = "#FFFF00" + nodamage = 1 + knockdown = 100 + stutter = 5 + jitter = 20 + hitsound = 'sound/weapons/taserhit.ogg' + range = 7 + tracer_type = /obj/effect/projectile/tracer/stun + muzzle_type = /obj/effect/projectile/muzzle/stun + impact_type = /obj/effect/projectile/impact/stun + +/obj/item/projectile/energy/electrode/on_hit(atom/target, blocked = FALSE) + . = ..() + if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - burst into sparks! + do_sparks(1, TRUE, src) + else if(iscarbon(target)) + var/mob/living/carbon/C = target + if(C.dna && C.dna.check_mutation(HULK)) + C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) + else if((C.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(C, TRAIT_STUNIMMUNE)) + addtimer(CALLBACK(C, /mob/living/carbon.proc/do_jitter_animation, jitter), 5) + +/obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet + do_sparks(1, TRUE, src) + ..() + +/obj/item/projectile/energy/net + name = "energy netting" + icon_state = "e_netting" + damage = 10 + damage_type = STAMINA + hitsound = 'sound/weapons/taserhit.ogg' + range = 10 + +/obj/item/projectile/energy/net/Initialize() + . = ..() + SpinAnimation() + +/obj/item/projectile/energy/net/on_hit(atom/target, blocked = FALSE) + if(isliving(target)) + var/turf/Tloc = get_turf(target) + if(!locate(/obj/effect/nettingportal) in Tloc) + new /obj/effect/nettingportal(Tloc) + ..() + +/obj/item/projectile/energy/net/on_range() + do_sparks(1, TRUE, src) + ..() + +/obj/effect/nettingportal + name = "DRAGnet teleportation field" + desc = "A field of bluespace energy, locking on to teleport a target." + icon = 'icons/effects/effects.dmi' + icon_state = "dragnetfield" + light_range = 3 + anchored = TRUE + +/obj/effect/nettingportal/Initialize() + . = ..() + var/obj/item/radio/beacon/teletarget = null + for(var/obj/machinery/computer/teleporter/com in GLOB.machines) + if(com.target) + if(com.power_station && com.power_station.teleporter_hub && com.power_station.engaged) + teletarget = com.target + + addtimer(CALLBACK(src, .proc/pop, teletarget), 30) + +/obj/effect/nettingportal/proc/pop(teletarget) + if(teletarget) + for(var/mob/living/L in get_turf(src)) + do_teleport(L, teletarget, 2)//teleport what's in the tile to the beacon + else + for(var/mob/living/L in get_turf(src)) + do_teleport(L, L, 15) //Otherwise it just warps you off somewhere. + + qdel(src) + +/obj/effect/nettingportal/singularity_act() + return + +/obj/effect/nettingportal/singularity_pull() + return + + +/obj/item/projectile/energy/trap + name = "energy snare" + icon_state = "e_snare" + nodamage = 1 + knockdown = 20 + hitsound = 'sound/weapons/taserhit.ogg' + range = 4 + +/obj/item/projectile/energy/trap/on_hit(atom/target, blocked = FALSE) + if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - drop a trap + new/obj/item/restraints/legcuffs/beartrap/energy(get_turf(loc)) + else if(iscarbon(target)) + var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy(get_turf(target)) + B.Crossed(target) + ..() + +/obj/item/projectile/energy/trap/on_range() + new /obj/item/restraints/legcuffs/beartrap/energy(loc) + ..() + +/obj/item/projectile/energy/trap/cyborg + name = "Energy Bola" + icon_state = "e_snare" + nodamage = 1 + knockdown = 0 + hitsound = 'sound/weapons/taserhit.ogg' + range = 10 + +/obj/item/projectile/energy/trap/cyborg/on_hit(atom/target, blocked = FALSE) + if(!ismob(target) || blocked >= 100) + do_sparks(1, TRUE, src) + qdel(src) + if(iscarbon(target)) + var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(target)) + B.Crossed(target) + QDEL_IN(src, 10) + ..() + +/obj/item/projectile/energy/trap/cyborg/on_range() + do_sparks(1, TRUE, src) + qdel(src) + +/obj/item/projectile/energy/declone + name = "radiation beam" + icon_state = "declone" + damage = 20 + damage_type = CLONE + irradiate = 10 + impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser + +/obj/item/projectile/energy/dart //ninja throwing dart + name = "dart" + icon_state = "toxin" + damage = 5 + damage_type = TOX + knockdown = 100 + range = 7 + +/obj/item/projectile/energy/bolt //ebow bolts + name = "bolt" + icon_state = "cbbolt" + damage = 8 + damage_type = TOX + nodamage = 0 + knockdown = 100 + stutter = 5 + +/obj/item/projectile/energy/bolt/halloween + name = "candy corn" + icon_state = "candy_corn" + +/obj/item/projectile/energy/bolt/large + damage = 20 + +/obj/item/projectile/energy/tesla + name = "tesla bolt" + icon_state = "tesla_projectile" + impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser + var/chain + +/obj/item/projectile/energy/tesla/fire(setAngle) + if(firer) + chain = firer.Beam(src, icon_state = "lightning[rand(1, 12)]", time = INFINITY, maxdistance = INFINITY) + ..() + +/obj/item/projectile/energy/tesla/Destroy() + qdel(chain) + return ..() + +/obj/item/projectile/energy/tesla/revolver + name = "energy orb" + +/obj/item/projectile/energy/tesla/revolver/on_hit(atom/target) + . = ..() + if(isliving(target)) + tesla_zap(target, 3, 10000) + qdel(src) + +/obj/item/projectile/energy/tesla/cannon + name = "tesla orb" + +/obj/item/projectile/energy/tesla/cannon/on_hit(atom/target) + . = ..() + tesla_zap(target, 3, 10000, explosive = FALSE, stun_mobs = FALSE) + qdel(src) diff --git a/tools/travis/before_build_tools.sh b/tools/travis/before_build_tools.sh new file mode 100644 index 0000000000..2329de82b2 --- /dev/null +++ b/tools/travis/before_build_tools.sh @@ -0,0 +1,7 @@ +#!/bin/bash +set -e + +if [ "$BUILD_TOOLS" = true ]; then + cd tgui && source ~/.nvm/nvm.sh && npm install && cd .. +fi; + diff --git a/tools/travis/build_byond.sh b/tools/travis/build_byond.sh new file mode 100644 index 0000000000..3a7e00df29 --- /dev/null +++ b/tools/travis/build_byond.sh @@ -0,0 +1,80 @@ +#!/bin/bash + +#nb: must be bash to support shopt globstar +set -e +shopt -s globstar + +if [ "$BUILD_TOOLS" = false ]; then + if grep -E '^\".+\" = \(.+\)' _maps/**/*.dmm; then + echo "Non-TGM formatted map detected. Please convert it using Map Merger!" + exit 1 + fi; + if grep -P '^\ttag = \"icon' _maps/**/*.dmm; then + echo "tag vars from icon state generation detected in maps, please remove them." + exit 1 + fi; + if grep 'step_[xy]' _maps/**/*.dmm; then + echo "step_x/step_y variables detected in maps, please remove them." + exit 1 + fi; + if grep 'pixel_[xy] = 0' _maps/**/*.dmm; then + echo "pixel_x/pixel_y = 0 variables detected in maps, please review to ensure they are not dirty varedits." + fi; + if grep -P '\td[1-2] =' _maps/**/*.dmm; then + echo "d1/d2 cable variables detected in maps, please remove them." + exit 1 + fi; + if grep '^/area/.+[\{]' _maps/**/*.dmm; then + echo "Vareditted /area path use detected in maps, please replace with proper paths." + exit 1 + fi; + if grep '\W\/turf\s*[,\){]' _maps/**/*.dmm; then + echo "base /turf path use detected in maps, please replace with proper paths." + exit 1 + fi; + if grep '^/*var/' code/**/*.dm; then + echo "Unmanaged global var use detected in code, please use the helpers." + exit 1 + fi; + if grep -i 'centcomm' code/**/*.dm; then + echo "Misspelling(s) of CENTCOM detected in code, please remove the extra M(s)." + exit 1 + fi; + if grep -i 'centcomm' _maps/**/*.dmm; then + echo "Misspelling(s) of CENTCOM detected in maps, please remove the extra M(s)." + exit 1 + fi; + + source $HOME/BYOND/byond/bin/byondsetup + if [ "$BUILD_TESTING" = true ]; then + tools/travis/dm.sh -DTRAVISBUILDING -DTRAVISTESTING -DALL_MAPS tgstation.dme + else + tools/travis/dm.sh -DTRAVISBUILDING tgstation.dme + + tools/deploy.sh travis_test + mkdir travis_test/config + + #test config + cp tools/travis/travis_config.txt travis_test/config/config.txt + + # get libmariadb, cache it so limmex doesn't get angery + if [ -f $HOME/libmariadb ]; then + #travis likes to interpret the cache command as it being a file for some reason + rm $HOME/libmariadb + fi + mkdir -p $HOME/libmariadb + if [ ! -f $HOME/libmariadb/libmariadb.so ]; then + wget http://www.byond.com/download/db/mariadb_client-2.0.0-linux.tgz + tar -xvf mariadb_client-2.0.0-linux.tgz + mv mariadb_client-2.0.0-linux/libmariadb.so $HOME/libmariadb/libmariadb.so + rm -rf mariadb_client-2.0.0-linux.tgz mariadb_client-2.0.0-linux + fi + + cd travis_test + ln -s $HOME/libmariadb/libmariadb.so libmariadb.so + DreamDaemon tgstation.dmb -close -trusted -verbose -params "test-run&log-directory=travis" + cd .. + cat travis_test/data/logs/travis/clean_run.lk + + fi; +fi; diff --git a/tools/travis/build_dependencies.sh b/tools/travis/build_dependencies.sh new file mode 100644 index 0000000000..2c24bdbaaf --- /dev/null +++ b/tools/travis/build_dependencies.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash + +set -e + +source dependencies.sh + +#ensure the Dockerfile version matches the dependencies.sh version +line=$(head -n 1 Dockerfile) +if [[ $line != *"$BYOND_MAJOR.$BYOND_MINOR"* ]]; then + echo "Dockerfile BYOND version in FROM command does not match dependencies.sh (Or it's not on line 1)!" + exit 1 +fi + +if [ $BUILD_TOOLS = false ] && [ $BUILD_TESTING = false ]; then + curl https://sh.rustup.rs -sSf | sh -s -- -y --default-host i686-unknown-linux-gnu + source ~/.profile + + mkdir rust-g + cd rust-g + git init + git remote add origin https://github.com/tgstation/rust-g + git fetch --depth 1 origin $RUST_G_VERSION + git checkout FETCH_HEAD + cargo build --release + cmp target/rust_g.dm ../code/__DEFINES/rust_g.dm + + mkdir -p ~/.byond/bin + ln -s $PWD/target/release/librust_g.so ~/.byond/bin/rust_g + + mkdir -p ../BSQL/artifacts + cd ../BSQL + git init + git remote add origin https://github.com/tgstation/BSQL + git fetch --depth 1 origin $BSQL_VERSION + git checkout FETCH_HEAD + + if [ -f "$HOME/MariaDB/libmariadb.so.2" ] && [ -f "$HOME/MariaDB/libmariadb.so" ] && [ -d "$HOME/MariaDB/include" ]; + then + echo "Using cached MariaDB library." + else + echo "Setting up MariaDB." + rm -rf "$HOME/MariaDB" + mkdir -p "$HOME/MariaDB" + mkdir -p "$HOME/MariaDB/include" + cp /usr/lib/i386-linux-gnu/libmariadb.so.2 $HOME/MariaDB/ + ln -s $HOME/MariaDB/libmariadb.so.2 $HOME/MariaDB/libmariadb.so + cp -r /usr/include/mariadb $HOME/MariaDB/include/ + fi + + cd artifacts + export CXX=g++-7 + cmake .. -DMARIA_INCLUDE_DIR=$HOME/MariaDB/include + make + mv src/BSQL/libBSQL.so ../../ +fi diff --git a/tools/travis/build_tools.sh b/tools/travis/build_tools.sh new file mode 100644 index 0000000000..eaccd64c8c --- /dev/null +++ b/tools/travis/build_tools.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +#must also be bash for the md5sum commands +set -e + +if [ "$BUILD_TOOLS" = true ]; +then + md5sum -c - <<< "49bc6b1b9ed56c83cceb6674bd97cb34 *html/changelogs/example.yml"; + (cd tgui && source ~/.nvm/nvm.sh && npm ci && node node_modules/gulp/bin/gulp.js --min) + phpenv global 5.6 + php -l tools/WebhookProcessor/github_webhook_processor.php; + php -l tools/TGUICompiler.php; + echo "Checking for JSON errors"; + find . -name "*.json" -not -path "./tgui/node_modules/*" | xargs -0 python3 ./tools/json_verifier.py; + python3 tools/ss13_genchangelog.py html/changelog.html html/changelogs; +fi; diff --git a/tools/travis/install_byond.sh b/tools/travis/install_byond.sh old mode 100755 new mode 100644