#!/usr/bin/perl -w ###################################################################### # Artemis DISCO Server, (C) 2015-2019 Nosey Nick Waterman, # https://noseynick.org/artemis/ # All wrong righted, all rights reserved. Licensed under thev GNU # Affero General Public License v3.0 https://www.gnu.org/licenses/agpl.txt # with Commons Clause https://commonsclause.com/ v1.0 ###################################################################### # run like: ./disco-server.pl | nc -vl 2010 > /dev/null # or socat TCP-L:2010,reuseaddr,fork exec:./disco-server.pl # (socat also comes with the advantage of re-spawning on re-connect) # May be on noseynick.net right now - point a 2.7.5 client at it! ###################################################################### use strict; use Time::HiRes qw(sleep time); use POSIX qw(strftime); use lib "."; require 'parser.pl'; $|=1; plainTextGreeting("You have connected to NoseyNick's Artemis DISCO SBS. Ladies, Gentlemen, Others, PARTY ON!"); sleep(0.2); if ($ENV{VER} && $ENV{VER} =~ /^(\d+)\.(\d+)\.(\d+)$/) { Version("$1$2$3", $1, $1,$2,$3); } else { Version(280, 2, 2,8,0); } sleep(0.2); clientConsoles(ship=>0, Main=>1, Helm=>0, Weap=>0, Eng=>0, Sci=>$ENV{SCI}, Comm=>0, Fighter=>0, Data=>0, Observer=>1, Captain=>0, GM=>0); AllShipSettings( ShipSetting(Warp => LightCruiser => 0, UTF16("D I S C O !")) x 8 ); if ($ENV{SOCAT_PID}) { print STDERR strftime("%Y/%m/%d %H:%M:%S", gmtime()), " socat[$ENV{SOCAT_PID}] C connection from ", $ENV{SOCAT_PEERADDR}//'???', ':', $ENV{SOCAT_PEERPORT}//'???', "\n"; } else { print STDERR join("\n", '#'x75, "### Click READY ... and...", '#'x75, ' ____ ___ ____ ____ ___ _', '| _ \_ _/ ___| / ___/ _ \| |', '| | | | |\___ \| | | | | | |', '| |_| | | ___) | |__| |_| |_|', '|____/___|____/ \____\___/(_)', '' ); } SkyBox(22); startGame(11,'Peacetime'); my @wavs = qw( WarpFail.wav player-shot1.wav testIUSound17.wav testIUSound6.wav WarpTravel.wav player-shot2.wav testIUSound18.wav testIUSound8.wav alarm1.wav shieldHit.wav testIUSound19.wav testIUSound9.wav alarm2.wav shieldsDown.wav testIUSound2.wav tractor.wav alarm3.wav shieldsUp.wav testIUSound20.wav weapon0.wav alarm4.wav testIUSound0.wav testIUSound21.wav weapon1.wav enemy-explode.wav testIUSound1.wav testIUSound22.wav weapon2.wav enemyDamaged.wav testIUSound10.wav testIUSound23.wav weapon3.wav engine2.wav testIUSound11.wav testIUSound24.wav whaleDeath.wav fighter-zap.wav testIUSound12.wav testIUSound25.wav whaleSong1.wav hullHit.wav testIUSound13.wav testIUSound26.wav whaleSong2.wav jumpWarmup.wav testIUSound14.wav testIUSound3.wav whaleSong3.wav mainframerumble1.wav testIUSound15.wav testIUSound4.wav overheat-warning.wav testIUSound16.wav testIUSound5.wav ); my @bar = qw(overheat-warning.wav 0 0 0 0 0 0 0); my $vol = 0; my $pufftype = 0; my $heartbeat = 0; while (1) { # KeyCaptureToggle(1); for (@bar) { sleep 0.2; SoundEffect(UTF16("dat/$_")) if $_; objectBitStream( ObjPlayerShip(1000, Target=>0,Impulse=>0,Rudder=>0.5,MaxImpulse=>0.6, TurnRate=>0.004,AutoBeams=>1,WarpFactor=>0,Energy=>1000, ShieldsUp=>1,Unknown22=>1,hullID=>0,X=>50000,Y=>0,Z=>50000, Pitch=>0,Roll=>0,Heading=>3.14159,Velocity=>0, InNebula=>0, Name=>UTF16("D I S C O !"),ForeShields=>80,ForeShieldsMax=>80, AftShields=>80,AftShieldsMax=>80,LastDockedBase=>0,RedAlert=>0, Unknown43=>200000,MainScreenView=>($ENV{TAC}?4:0),BeamFreq=>0, AvailableCoolant=>8,ScienceTarget=>1014,CaptainTarget=>0,DriveType=>0, ScanningID=>0,ScanningProgress=>0,Reverse=>0,ClimbDive=>0, Side=>2,ShowOnMaps=>-1,ShipNum=>0,CapShipID=>18, AccentHue=>rand(), # D I S C O ! EmergencyJumpTime=>0, beaconMonsterType=>0, beaconEffect=>0, ), ObjEOL() ); objectBitStream( ObjNebula(1010, X=>52000,Y=>0,Z=>46000, R=>rand(1),G=>0,B=>0, nebType=>1), # 1=#32004c purple ObjNebula(1011, X=>50000,Y=>0,Z=>46000, R=>0,G=>rand(1),B=>0, nebType=>2), # 2=#00324c cyan ObjNebula(1012, X=>48000,Y=>0,Z=>46000, R=>0,G=>0,B=>rand(1), nebType=>3), # 3=#32321a yellow ObjEOL() ); objectBitStream( ObjMine(1013, X=>50000,Y=>0,Z=>48000), ObjEOL() ); if ($ENV{CREATURE}) { objectBitStream( ObjCreature(1014,X=>51000,Y=>0,Z=>48000, Name=>UTF16("DRAGON"),Heading=>0,Pitch=>0,Roll=>0, CreatureType=>$ENV{CRTYPE}//3, SingleScan=>4, Unknown22=>0, # DoubleScan? # WTF are these?!?! Unknown23=> 0, Unknown24=> 0, Unknown25=> 0, Unknown26=>0.75, # -1 or 0 makes dragon invisible?!? Health=>700,MaxHealth=>700, Age=>3, # (0=REPEL) 1=Young 2=Mature, 3=Ancient ShowOnMaps=>4, ), ObjEOL() ); } if ($ENV{BASE}) { objectBitStream( ObjBase(1015,Name=>UTF16("DS1"),Shields=>400,MaxShields=>400, Index=>6,hullID=>1000,X=>49000,Y=>0,Z=>48000, Unknown21=>0,Unknown22=>0,Unknown23=>0,Unknown24=>0,Unknown25=>0,Side=>2), ObjEOL() ); } if ($ENV{TORP}) { objectBitStream( ObjTorpedo(1016, X=>50500,Y=>0,Z=>48000, dX=>0, dY=>0, dZ=>0, Unknown17=>11, OrdnanceType=>$ENV{ORDTYPE}//1), ObjTorpedo(1017, X=>49500,Y=>0,Z=>48000, dX=>0, dY=>0, dZ=>0, Unknown17=>11, OrdnanceType=>$ENV{ORDTYPE}//3), ObjEOL() ); } shipSystemSync(0, Damage(int(rand(5)),1+rand(3),6+rand(4) => 0), Damage(int(rand(5)),1+rand(3),6+rand(4) => 1), EODamage(),EODamConTeam() ); } $bar[rand(@bar)] = 0; $bar[rand(@bar)] = $wavs[rand(@wavs)]; if ($ENV{KABOOM}) { Kaboom( ObjMine(1013)); Kaboom( ObjCreature(1014)) if $ENV{CREATURE}; Kaboom( ObjBase(1015)) if $ENV{BASE}; Kaboom( ObjTorpedo(1016)) if $ENV{TORP}; Kaboom( ObjTorpedo(1017)) if $ENV{TORP}; } else { Detonate(ObjMine(1013)); Detonate(ObjCreature(1014)) if $ENV{CREATURE}; Detonate(ObjBase(1015)) if $ENV{BASE}; Detonate(ObjTorpedo(1016)) if $ENV{TORP}; Detonate(ObjTorpedo(1017)) if $ENV{TORP}; } if ($ENV{VOL}) { Tension($vol); # sound-effect related? volume? print STDERR "vol=$vol\n" if $ENV{DEBUG}; $vol += 50; $vol = 0 if $vol > 101; } DamageShake(0,0.77) if $ENV{SHAKE}; my $type = int($pufftype++/5); $pufftype=0 if $pufftype>39; SmokePuff(1000, $type, 2.0*$pufftype-40.0, -40, -40); my $now = time(); if ($now > $heartbeat) { $heartbeat = $now + 3; heartbeat(); my $ti = int ($now*1000); idleText(UTF16("PING").UTF16("please ignore $ti")); } }