r5114 - trunk/misc
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Thu Nov 27 03:10:11 EST 2008
Author: div0
Date: 2008-11-27 03:10:04 -0500 (Thu, 27 Nov 2008)
New Revision: 5114
Added:
trunk/misc/assault-circuit-board-creator.pl
Log:
add the ACBC Assault Circuit Board Creator
a script that makes an assault map template given objective counts
Added: trunk/misc/assault-circuit-board-creator.pl
===================================================================
--- trunk/misc/assault-circuit-board-creator.pl (rev 0)
+++ trunk/misc/assault-circuit-board-creator.pl 2008-11-27 08:10:04 UTC (rev 5114)
@@ -0,0 +1,277 @@
+#!/usr/bin/perl
+
+# script that creates an "assault circuit"
+
+use strict;
+use warnings;
+
+my @objectives = @ARGV;
+
+if(!@objectives)
+{
+ print STDERR <<EOF;
+Assault Circuit Board Creator
+
+Usage:
+ [brushprimit=1 \\]
+ [ofs_x=offset \\]
+ [ofs_y=offset \\]
+ [ofs_z=offset \\]
+ perl $0 breakables1[,buttons1] breakables2[,buttons2] breakables3[,buttons3] ... \\
+ > file.map
+
+Example:
+ ofs_z=1024 perl $0 1 1 3,2 1 > assault.map
+EOF
+ exit 1;
+}
+
+my $bp = $ENV{brushprimit};
+my @ofs = ($ENV{ofs_x} || 0, $ENV{ofs_y} || 0, $ENV{ofs_z} || 0);
+
+my $BRUSHDEF_START = $bp ? "{\nbrushDef\n{" : "{";
+my $BRUSHDEF_END = $bp ? "}\n}" : "}";
+my $BRUSHDEF_PRE = $bp ? "( ( 0.03125 0 -0 ) ( -0 0.03125 0 ) ) " : "";
+my $BRUSHDEF_POST = $bp ? " 0 0 0" : " 0 0 0 0.500000 0.500000 0 0 0";
+
+sub BrushRectangle($@@)
+{
+ my ($shader, $x0, $y0, $z0, $x1, $y1, $z1) = @_;
+ return <<EOF;
+$BRUSHDEF_START
+( $x1 $y1 $z1 ) ( $x1 $y0 $z1 ) ( $x0 $y1 $z1 ) $BRUSHDEF_PRE$shader$BRUSHDEF_POST
+( $x1 $y1 $z1 ) ( $x0 $y1 $z1 ) ( $x1 $y1 $z0 ) $BRUSHDEF_PRE$shader$BRUSHDEF_POST
+( $x1 $y1 $z1 ) ( $x1 $y1 $z0 ) ( $x1 $y0 $z1 ) $BRUSHDEF_PRE$shader$BRUSHDEF_POST
+( $x0 $y0 $z0 ) ( $x1 $y0 $z0 ) ( $x0 $y1 $z0 ) $BRUSHDEF_PRE$shader$BRUSHDEF_POST
+( $x0 $y0 $z0 ) ( $x0 $y0 $z1 ) ( $x1 $y0 $z0 ) $BRUSHDEF_PRE$shader$BRUSHDEF_POST
+( $x0 $y0 $z0 ) ( $x0 $y1 $z0 ) ( $x0 $y0 $z1 ) $BRUSHDEF_PRE$shader$BRUSHDEF_POST
+$BRUSHDEF_END
+EOF
+}
+
+sub Entity(%)
+{
+ my (%h) = @_;
+ my @brushes = ();
+ if(ref $h{model} eq 'ARRAY')
+ {
+ @brushes = @{$h{model}};
+ delete $h{model};
+ }
+ return join "", ("{\n", (map { qq{"$_" "$h{$_}"\n} } keys %h), @brushes, "}\n");
+ # "
+}
+
+sub FindDamage($)
+{
+ my ($cnt) = @_;
+
+ my $dmg;
+
+ # 1. divisible by 10?
+ $dmg = (1 + int(10 / $cnt)) * 10;
+ return $dmg
+ if $dmg * ($cnt - 1) < 100;
+
+ # 2. divisible by 5?
+ $dmg = (1 + int(20 / $cnt)) * 5;
+ return $dmg
+ if $dmg * ($cnt - 1) < 100;
+
+ # 3. divisible by 2?
+ $dmg = (1 + int(50 / $cnt)) * 2;
+ return $dmg
+ if $dmg * ($cnt - 1) < 100;
+
+ # 4. divisible by 1?
+ $dmg = (1 + int(100 / $cnt));
+ return $dmg
+ if $dmg * ($cnt - 1) < 100;
+
+ # 5. give up
+ return (100 / $cnt + 100 / ($cnt + 1)) / 2;
+}
+
+sub ObjectiveSpawns($@)
+{
+ my ($target, $x, $y, $z) = @_;
+
+ my @l = ();
+
+ $z -= 64;
+
+ for(1..6)
+ {
+ my $xx = $x - 32;
+ my $yy = $y + ($_ - 3.5) * 64;
+ push @l, Entity
+ classname => "info_player_attacker",
+ target => $target,
+ origin => "$xx $yy $z";
+
+ $xx = $x + 32;
+ push @l, Entity
+ classname => "info_player_defender",
+ target => $target,
+ origin => "$xx $yy $z";
+ }
+
+ return @l;
+}
+
+my @assault_entities = ();
+
+my $obj_prev = undef;
+my $des_prev = undef;
+
+my @prevorigin = (-256, 0, 0);
+
+for my $i(0.. at objectives - 1)
+{
+ my @origin =
+ (
+ $ofs[0] + $i * 256,
+ $ofs[1] + 0,
+ $ofs[2] + 0
+ );
+
+ my $count = $objectives[$i];
+ $count =~ /^(\d+)(?:,(\d+))?$/s
+ or die "Invalid count spec: must be number or number,number";
+ my $count_destroy = $1;
+ my $count_push = $2 || 0;
+ $count = $count_destroy + $count_push;
+
+ my $obj = "obj$i";
+ my $des = "obj$i\_destructible";
+ my $dec = "obj$i\_decrease";
+
+ if($i == 0)
+ {
+ push @assault_entities, Entity
+ classname => "target_assault_roundstart",
+ target => $obj,
+ target2 => $des,
+ origin => "@prevorigin";
+ }
+ else
+ {
+ push @assault_entities, Entity
+ classname => "target_objective",
+ targetname => $obj_prev,
+ target => $obj,
+ target2 => $des,
+ origin => "@prevorigin";
+
+ push @assault_entities, ObjectiveSpawns $obj_prev, @prevorigin;
+
+ push @assault_entities, Entity
+ classname => "func_assault_wall",
+ target => $obj_prev,
+ model => [
+ BrushRectangle
+ "dsi/dsiglass",
+ $origin[0] - 128 - 16,
+ $origin[1] - 512,
+ $origin[2] - 512,
+ $origin[0] - 128 + 16,
+ $origin[1] + 512,
+ $origin[2] + 512
+ ];
+ }
+
+ @prevorigin = @origin;
+
+ $origin[2] += 64;
+
+ my $dmg = FindDamage($count);
+
+ push @assault_entities, Entity
+ classname => "target_objective_decrease",
+ targetname => $dec,
+ target => $obj,
+ dmg => $dmg,
+ origin => "@origin";
+
+ $origin[2] += 64;
+
+ for(1..$count_destroy)
+ {
+ push @assault_entities, Entity
+ classname => "func_assault_destructible",
+ targetname => $des,
+ target => $dec,
+ health => 1000,
+ mdl => "rocket_explode",
+ count => 1,
+ noise => "weapons/rocket_impact.wav",
+ dmg => 50,
+ dmg_edge => 0,
+ dmg_radius => 150,
+ dmg_force => 200,
+ model => [
+ BrushRectangle
+ "dsi/cretebase",
+ $origin[0] - 16,
+ $origin[1] - 16,
+ $origin[2] - 16,
+ $origin[0] + 16,
+ $origin[1] + 16,
+ $origin[2] + 16
+ ];
+
+ $origin[2] += 64;
+ }
+
+ for(1..$count_push)
+ {
+ push @assault_entities, Entity
+ classname => "func_button",
+ target => $dec,
+ angle => -2,
+ model => [
+ BrushRectangle
+ "dsi/dablue",
+ $origin[0] - 16,
+ $origin[1] - 16,
+ $origin[2] - 16,
+ $origin[0] + 16,
+ $origin[1] + 16,
+ $origin[2] + 16
+ ];
+
+ $origin[2] += 64;
+ }
+
+ $obj_prev = $obj;
+ $des_prev = $des;
+}
+
+my $obj = "roundend";
+my @origin =
+(
+ $ofs[0] + @objectives * 256,
+ $ofs[1] + 0,
+ $ofs[2] + 0
+);
+
+push @assault_entities, Entity
+ classname => "target_objective",
+ targetname => $obj_prev,
+ target => $obj,
+ origin => "@prevorigin";
+
+push @assault_entities, ObjectiveSpawns $obj_prev, @prevorigin;
+
+push @assault_entities, Entity
+ classname => "target_assault_roundend",
+ targetname => $obj,
+ origin => "@origin";
+
+my $map = join "",
+(
+ Entity(classname => "worldspawn"),
+ @assault_entities
+);
+
+print $map;
More information about the nexuiz-commits
mailing list