awesome man!
The year was 2015, and purely by accident, we created something...indescribable. Objects moved as if by phantoms, pushed, pulled, spun. We'd never seen anything like it, and rather mundanely we decided to call this new innovation our "applyForce" technology.
-Albert Herald
Perhaps believing ourselves masters of this strange force, we took it as far as we could, recognising nearby objects, analysing them, and moving them into place. Composing and operating entire contraptions without a single weld, rope, or hydraulic. At the time, it was glorious.
-Michael Yroth
We were perhaps...misguided. Combining applyForce technology and the detailed operating systems that my works have become famous for, we made something terrible. Something virtually unstoppable.
-Albert Herald
We were fools. The old gods had been our poetic inspiration for years, and what we made was the worst of them all, given physical form. We stupidly called it Cronus.
-Michael Yroth
Backstory
As far as RP goes, because I've made one for pretty much all my drones (present and future), Cronus was fully developed before any of the Olympus drones, and before Valhalla Inc. and Olympus Technologies were separate companies, back in the days of Herald Ent. when the founders of the two companies worked side by side making new technologies.
When Cronus was finally made, the two had a falling out over what to actually do with it. Herald saw it as the wave of the future, though has never dared make anything with such unrestrained control of it's environment (Vector thrusters and the like). Yroth instead saw applyForce as a semi-demonic technology, and Valhalla drones stayed firmly away from it.
But then, in 2053, Yroth had been dead for 12 years and Herald hadn't been seen in public for 13. The two estranged companies decided to restore their public comradery with a joint project, and broke Cronus out of mothball for some "updating".
Features
As far as Gmod is concerned, Cronus is a drone capable of self-evolution, self-repairs, and with not a single weld in its design. It is designed to only get stronger, to never die, and to never stop until it achieves it's objective (Which, presently running in my mind, is essentially the destruction of everything else). It is, put rather plainly and inaccurately, Gmod's version of the Terminator, as seen from the perspective of the surviving humans.
- Chassis: what the drone is composed of
The entire body of Cronus is essentially a Wired Wirer (Courtesy of Jeremydeath), a Wired User and a series of networked expression 2 chips. But when activated, it looks through unconstrained and unfrozen props in the surrounding area, analyses them by boxCenter and boxSize, compares them to it's factory standard scales, and then assigns them a body position (Left arm, right arm, left leg, right leg, pelvis, skull, and trunk) and uses applyForce to move them into position, the E2 chip typically placed right infront of the skull whilst the Wirers generaly move to the "shoulder" side of the arms. Upgrade props generally take position at the hands end, with prop spawners usually going to the outer sides.- Self-Evolution: how the drone gets stronger
Using the Wirer and entity discovery, Cronus can find new wire objects and attach them to itself, allowing it to continue upgrading as it goes. So if it finds a wire prop spawner, it can pick it up, wire to it, and then position it on one of the arms and use it as a kind of missile launcher. The same goes for turrets, stool turrets, igniters, lasers, etc. As long as it still has one Wirer still wirelinked to it's chip, it keeps looking for upgrade parts. If it finds a data transferer and there are Olympus drones about, well you can probably tell where that's going.
Important to note is that the Wirer is wirelinked to the chip. Once it's destroyed, likely by lucky shots with a remover gun, the upgrading portion of the code shuts off.- Offense: how the drone kills and destroys things
When a body prop is destroyed, it keeps going, because it has no reliance on them. But if it finds that it's facing overwhelming odds (# of targets, rather than their armament), it will try to play dead, by making it's E2 chip invisible and ceasing the applyForce containment on it's remaining props. Basically causing it to seem as though the chip has been destroyed and the drone just falls apart harmlessly. It will then wait until the targets either leave completely or reach a more manageable level and re-assemble to attack again.
It, as previously mentioned, looks for prop spawners as missile launchers, but using a bit of trial and error and an array of previously-discovered models, it can find explosive props and prioritise their prop spawning equivalents over alternatives. Explosive barrels and RPG missiles are of course higher priority over a 1x1 tile block, because the block can only hit one target at a time. When it finds a prop spawner, it wires to it and immediately spawns a prop from it. It then moves that prop to a position where it can try to crush it, and if it detects that the prop ceases to exist, it considers it to be explosive. Naturally, this has the issue that wooden props and other destructibles are selected as explosives, so there'll need to be a way around that, perhaps by searching for the keyword "wood" in their model name. To save on lag, prop spawned objects that have hit their targets are then immediately undone.
If it has no upgrade weaponry, it has one of two options as far as attack goes. It can hurl one of it's own body parts at the target at high velocity, a kind of "force punch" if you will, or it will look for unconstrained props in the environment and hurl them, a kind of "telekinesis".- Defense: how the drone avoids destruction
Defense is simple, it doesn't need any of it's body parts so it doesn't care about them. But if it finds that they're dropping like stones, it'll turn it's E2 chips invisible (entity():setAlpha(0)) and "hide" them elsewhere, whilst the body continues on, using entity discovery and built-in ranger functions from the skull instead. Alternatively, it may try to feign concern by moving the trunk body part or whatever's left infront of the chip. When it finds no targets are left in the area, or re-awakens from playing dead, it searchs again for props to fill in the blanks of it's missing body parts.- Destruction: killing the drone
Destruction of a drone that has no prop reliance beyond it's own OS chips is a very tricky endeavour. There are no welds, so the LUA cinderblock is pointless, and the remover gun will only remove one body part if you miss the small chips (Even if you do hit one of the chips, you need to be lucky enough to hit something vitally important). Anything less than absolute and undeniable destruction of the chips means it will always come back. So my best advice would be to try and overwhelm it into it's "play dead" mode and then use automated targetting to get rid of the chips.
Additionally, there is the Master to worry about. Whenever a drone is destroyed, the associated Master will activate a new drone. The Master sits thousands of units beneath the ground, in the void, so you would need to find it and destroy it before you destroyed the drone, and doing so would cause the Master to activate every one of it's drones that are kept on ice "just in case", which means you could be dealing with up to 9 drones after destroying the Master, and if you don't the drone just keeps coming back.
This is a drone that is, by design, almost fundamentally indestructible.
This is not a contraption showcase thread, this is not a challenge thread, this is a thread for community co-ordination in the development of this contraption.
Last edited by Lyinginbedmon; 11-11-2009 at 08:32 AM. Reason: Updated descriptions
awesome man!
Download when its done please.
Last edited by AutomatedOwner; 06-27-2009 at 07:50 PM.
Yay! My wirers are being put to good use.This is pretty much what I had in mind when I made them. (oh yeah, if you haven't seen, there is a new version of them out with better accuracy, wirelink creation capability, and wire node creation (pretty wiring) )
EDIT: Also, looking through it, it seems that it might be better to have its chassis be in more of a worm, or other VERY simplistic form. And, here is a video that is just cool and might give you some ideas:
Last edited by Jeremydeath; 06-04-2009 at 05:34 PM.
Jeremydeath's Wire Addons - Try Them... NOW!
Finalised Codes
- BODY PROP ASSIGNMENT
- Function: Locates body props to be used by the Positioning chip
- Requires: Props array and Point vector
- Produces: BodyProps array and Scale number
- Code:
E2 Code:
@name CRONUS BPROP ASSIGNMENT V2 @inputs Props:array Point:vector @outputs BodyProps:array Scale @persist P RP Vary [V1 V2]:vector Sizes:array if(first()){ #Base sizes Sizes:pushVector(vec(17,14,15)) Sizes:pushVector(vec(36,36,1)) Sizes:pushVector(vec(19,19,6)) Sizes:pushVector(vec(24,12,12)) Sizes:pushVector(vec(24,12,12)) Sizes:pushVector(vec(24,12,12)) Sizes:pushVector(vec(24,12,12)) Vary=0.12 #Standard variance for prop sizes (%) runOnTick(1) Scale=1 } rangerFilter(BodyProps) #BodyProp Status if(!RP){ M=1 while(M<=Sizes:count() & !RP){ Prop=BodyProps[M,entity] #Drop and search for new body prop if: #Prop has been destroyed #Prop has been frozen #Prop has been constrained if(!Prop|Prop:isFrozen()|Prop:hasConstraints()){ RP=M Size=Sizes[RP,vector]*Scale V1=Size-(Size*Vary) V2=Size*(Vary+1) } M++ } } #Body prop replacement if(RP){ M=0 while(P<=Props:count() & M<=10 & RP){ Ent=Props[P,entity] #Body Prop Check BPC=1 if(BodyProps:count()){ Z=0 while(Z<=Sizes:count()){ if(Ent==BodyProps[Z,entity]){ BPC=0 } Z++ } } #True if not a body prop #Constraint check if(BPC){ Count=Ent:hasConstraints() if(!Count){ #True if unconstrained Froze=Ent:isFrozen() if(!Froze){ #True if unfrozen ECen=Ent:toWorld(Ent:boxCenter()) R=rangerOffset(Point,ECen) if(R:entity()==Ent){ #True of visible if(BodyProps:count()){ EBox=Ent:boxSize() SC=max(EBox,V2)==V2 SC+=min(EBox,V1)==V1 } else{ SC=1 } #True if good size } } } } if(BPC & SC){ BodyProps[RP,entity]=Ent Ent:setMaterial("models/debug/debugwhite") Ent:setAlpha(255*(RP/7)) RP=0 } P++ M++ } if(P>=Props:count()){P=0} } #Rescaling if(BodyProps:count()){ M=0 Scaling=array() while(M<=Sizes:count()){ Comp=Sizes[M,vector] Vec=BodyProps[M,entity]:boxSize() V=Vec/Comp Var=(V:x()+V:y()+V:z())/3 Scaling[M,number]=Var M++ } if(Scaling:count()==Sizes:count()){ Scale=Scaling:average() } }- ENTITY(N) DISCOVERY
- Function: Locates entities based on their entity IDs and sorts them into recognisable groups.
- Requires: Entity ID number
- Produces: Chips, Props, Players, NPCs, and Targets arrays
- Code:
E2 Code:
@name Entity(N) Discovery @inputs ID @persist NewN MaxN MinN HDif LDif IDs:array @outputs [Chips Players Props NPCs Targets]:array if(first()){ runOnTick(1) MaxN=MinN=NewN=entity():id() } #IDs array ensures viable IDs aren't missed due to #loops already in sequence if(ID!=IDs[IDs:count(),number]){ if(ID>MaxN|ID<MinN){ IDs:pushNumber(ID) } } #NewN alteration if((HDif+LDif)==0){ #Wait until the previous ID has been run before changing #In most cases this will only take a fraction of a second if(IDs:count()>1){IDs:remove(1)} NewN=IDs[1,number] } #Separations from the known finds HDif=NewN-MaxN #IDs above the Maximum found HDif=clamp(HDif,0,abs(HDif)) LDif=MinN-NewN #IDs below the Minimum found LDif=clamp(LDif,0,abs(LDif)) Clamp=clamp(max(HDif,LDif),0,10) #Immediate search magnitude N=0 while(N<=Clamp & (HDif+LDif)>0){ if(HDif){ MaxN++ Ent=entity(MaxN) } elseif(LDif){ MinN-- Ent=entity(MinN) } Typ=Ent:type() #Entity type #Expression 2 chips if(Typ:find("expression2")){ Chips:pushEntity(Ent) } #NPCs elseif(Typ:find("npc_")){ NPCs:pushEntity(Ent) Targets:pushEntity(Ent) } #Players elseif(Typ:lower()=="player"){ Players:pushEntity(Ent) Targets:pushEntity(Ent) } #Props elseif(Typ:find("prop_physics")){ Props:pushEntity(Ent) } N++ }- EYE OF CRONUS
- Function: Creates an aesthetic hologram eye of the Cronus 2.0 symbol that looks where the Eye chip is currently checking.
- Requires: Look & Point vectors
- Produces: N/A
- Code:
E2 Code:
@name CRONUS EYE v2 @inputs [Look Point]:vector @persist [H7 H1]:entity if(first()){ Angles=array(),Colours=array(),Materials=array(),Models=array(),Parents=array(),Positions=array(),Scales=array() #Creation array populating Angles[1,angle]=ang(270,0,0),Angles[2,angle]=ang(),Angles[3,angle]=ang(40,90,90),Angles[4,angle]=ang(-40,90,90),Angles[5,angle]=ang(45,40,0),Angles[6,angle]=ang(-45,-40,0),Angles[7,angle]=ang(0,90,0) Colours[1,vector]=vec(0,1,1)*191.25,Colours[2,vector]=vec(0,1,1)*255,Colours[3,vector]=vec(1,1,1)*255,Colours[4,vector]=vec(1,1,1)*255,Colours[5,vector]=vec(1,1,1)*255,Colours[6,vector]=vec(1,1,1)*255,Colours[7,vector]=vec(0,1,1)*255 Models[1,string]="hqicosphere2",Models[2,string]="hqicosphere2",Models[3,string]="hqcylinder",Models[4,string]="hqcylinder",Models[5,string]="hqcylinder",Models[6,string]="hqcylinder",Models[7,string]="hqicosphere2" Parents[1,number]=7,Parents[2,number]=1,Parents[3,number]=7,Parents[4,number]=7,Parents[5,number]=7,Parents[6,number]=7,Parents[7,number]=7 Positions[1,vector]=vec(),Positions[2,vector]=vec(0,0,1),Positions[3,vector]=vec(0,-3,-7),Positions[4,vector]=vec(0,-3,6),Positions[5,vector]=vec(-7,-4,6),Positions[6,vector]=vec(7,-4,6),Positions[7,vector]=vec(0,-4,0) Scales[1,vector]=vec(2,2,2)/3,Scales[2,vector]=vec(3,3,6)/9,Scales[3,vector]=vec(1,4,1)/3,Scales[4,vector]=vec(1,4,1)/3,Scales[5,vector]=vec(4,1,1)/3,Scales[6,vector]=vec(4,1,1)/3,Scales[7,vector]=vec(1,5,4)/3 #Creation arrays ditched after first execution print(Angles:count()+"") #Hologram production S=0 P=0 #Spawning while(S<=Positions:count()){ Pos=Positions[S,vector] Sca=Scales[S,vector] Ang=Angles[S,angle] Col=Colours[S,vector] holoCreate(S,Pos,Sca,Ang,Col) holoModel(S,Models[S,string]) if(S==7){holoMaterial(7,"models/props_combine/tpballglow")} S++ } #Parenting while(S==Positions:count()+1&P<=Positions:count()){ holoParent(P,Parents[P,number]) P++ } H1=holoEntity(1) H7=holoEntity(7) runOnTick(1) } #Hover position determination if(Point){Po=Point}else{Po=entity():pos()} holoPos(7,Po) #Look position determination if(Look){T=Look}else{T=H1:pos()+entity():forward()} if(!Look & $Look){reset()} #Prevents angle locking if the Eye chip is destroyed #Main body turning (25 times slower) A7=(T-H7:pos()):toAngle()-H7:angles() C=(H7:angles()+A7/25):setRoll(0) holoAng(7,C) #Eye turning A=(T-H1:pos()):toAngle() holoAng(1,A)
Last edited by Lyinginbedmon; 12-22-2009 at 12:20 AM.
You'd think so and yet here we are.
Anyways, tested the above skull-finding code.
Finally glad to see your not just talking about bots and actually making bots ^^
Last edited by Solece; 12-31-2009 at 07:29 AM.
Originally Posted by Ehmmett
Bookmarks