loadfont centerprint fonts/DejaVuSansMono,gfx/conchars 9
loadfont infobar fonts/DejaVuSansMono,gfx/conchars 8 12 $scr_loadingscreen_barheight $scr_infobar_height
loadfont user0 fonts/DejaVuSans-Bold,gfx/vera-sans 12
-loadfont user1 fonts/DejaVuSans-Bold,gfx/vera-sans 4 6 8 10 12 14 16 20 24 28 32 $hud_fontsize $scr_centersize // csqc font
-loadfont user2 fonts/DejaVuSans-Bold,gfx/vera-sans 4 6 8 10 12 14 16 20 24 28 32 $hud_fontsize $scr_centersize // csqc boldfont
-loadfont user3 fonts/DejaVuSans-Bold,gfx/vera-sans 16
+loadfont user1 fonts/DejaVuSans-Bold,gfx/vera-sans 4 6 8 10 12 14 16 20 24 28 32 $hud_fontsize // csqc font
+loadfont user2 fonts/DejaVuSans-Bold,gfx/vera-sans 4 6 8 10 12 14 16 20 24 28 32 $hud_fontsize // csqc boldfont
+loadfont user3 fonts/DejaVuSans-Bold,gfx/vera-sans 12 16
scoreboard_columns_set
loadfont centerprint fonts/unifont,gfx/vera-sans 9
loadfont infobar fonts/n019004l.pfb,fonts/unifont,gfx/vera-sans 8 12 $scr_loadingscreen_barheight $scr_infobar_height
loadfont user0 fonts/n019004l.pfb,fonts/unifont,gfx/vera-sans 12 // menu font
-loadfont user1 fonts/n019004l.pfb,fonts/unifont,gfx/vera-sans 4 6 8 10 12 14 16 20 24 28 32 $hud_fontsize $scr_centersize // csqc font
-loadfont user2 fonts/n019004l.pfb,fonts/unifont,gfx/vera-sans 4 6 8 10 12 14 16 20 24 28 32 $hud_fontsize $scr_centersize // csqc boldfont
-loadfont user3 fonts/n019004l.pfb,fonts/unifont,gfx/vera-sans 16 // menu boldfont
+loadfont user1 fonts/n019004l.pfb,fonts/unifont,gfx/vera-sans 4 6 8 10 12 14 16 20 24 28 32 $hud_fontsize // csqc font
+loadfont user2 fonts/n019004l.pfb,fonts/unifont,gfx/vera-sans 4 6 8 10 12 14 16 20 24 28 32 $hud_fontsize // csqc boldfont
+loadfont user3 fonts/n019004l.pfb,fonts/unifont,gfx/vera-sans 12 16 // menu boldfont
scoreboard_columns_set
loadfont centerprint fonts/xolonium-regular.otf,fonts/unifont,gfx/vera-sans 9
loadfont infobar fonts/xolonium-regular.otf,fonts/unifont,gfx/vera-sans 8 12 $scr_loadingscreen_barheight $scr_infobar_height
loadfont user0 fonts/xolonium-regular.otf,fonts/unifont,gfx/vera-sans 12 // menu font
-loadfont user1 fonts/xolonium-regular.otf,fonts/unifont,gfx/vera-sans 4 6 8 10 12 14 16 20 24 28 32 $hud_fontsize $scr_centersize // csqc font
-loadfont user2 fonts/xolonium-bold.otf,fonts/unifont,gfx/vera-sans 4 6 8 10 12 14 16 20 24 28 32 $hud_fontsize $scr_centersize // csqc bold font
-loadfont user3 fonts/xolonium-bold.otf,fonts/unifont,gfx/vera-sans 16 // menu boldfont
+loadfont user1 fonts/xolonium-regular.otf,fonts/unifont,gfx/vera-sans 4 6 8 10 12 14 16 20 24 28 32 $hud_fontsize // csqc font
+loadfont user2 fonts/xolonium-bold.otf,fonts/unifont,gfx/vera-sans 4 6 8 10 12 14 16 20 24 28 32 $hud_fontsize // csqc bold font
+loadfont user3 fonts/xolonium-bold.otf,fonts/unifont,gfx/vera-sans 12 16 // menu boldfont
scoreboard_columns_set
# Current released version.
-V 0.7.0
+V 0.8.0
# Download URL.
-D http://dl.xonotic.org/xonotic-0.7.0.zip
+D http://dl.xonotic.org/xonotic-0.8.0.zip
# When releasing, create this string by:
# date -u +%Y%m%d%H%M%S -d'now + 3 months'
-C 20131013223900
+C 20150420201114
# Website URL.
U http://www.xonotic.org/
# Emergency packs. Specify as:
# E http://packurl/pack.pk3 file-in-pack.txt
+E http://dl.xonotic.org/zzzz-xonotic-0.8hotfix_chatbubble.pk3 scripts/chatbubble_hotfix.shader
# Recommended servers.
# R <key or IP here>
release_common
binary=$1
basename=${binary##*/}
+ dpname=darkplaces${basename#xonotic}
rev=`( cd "$d0/darkplaces" && git rev-parse HEAD )`
- verbose wget -O "$binary" "http://beta.xonotic.org/autobuild-bin/$rev/$basename"
+ verbose wget -O "$binary" "http://beta.xonotic.org/autobuild-bin/$rev/$dpname"
[ -s "$binary" ] || rm -f "$binary"
[ -f "$binary" ]
- # TODO eventually do the rebranding on travis too.
case "$binary" in
- Xonotic/xonotic*.exe)
- verbose "$d0/misc/tools/change-icon-of-exe.sh" "$d0/misc/logos/icons_ico/xonotic.ico" "$binary"
- ;;
Xonotic/*osx*|Xonotic/*linux*)
chmod +x "$binary"
;;
release-engine-win32)
release_common
good=true
- verbose "$SELF" release-getbinary Xonotic/xonotic.exe || good=false
- verbose "$SELF" release-getbinary Xonotic/xonotic-sdl.exe || good=false
- verbose "$SELF" release-getbinary Xonotic/xonotic-dedicated.exe || good=false
+ verbose "$SELF" release-getbinary Xonotic/xonotic-x86.exe || good=false
+ verbose "$SELF" release-getbinary Xonotic/xonotic-x86-wgl.exe || good=false
+ verbose "$SELF" release-getbinary Xonotic/xonotic-x86-dedicated.exe || good=false
$good
;;
release-engine-win64)
release_common
good=true
- verbose "$SELF" release-getbinary Xonotic/xonotic-x64.exe || good=false
- verbose "$SELF" release-getbinary Xonotic/xonotic-x64-sdl.exe || good=false
- verbose "$SELF" release-getbinary Xonotic/xonotic-x64-dedicated.exe || good=false
+ verbose "$SELF" release-getbinary Xonotic/xonotic.exe || good=false
+ verbose "$SELF" release-getbinary Xonotic/xonotic-wgl.exe || good=false
+ verbose "$SELF" release-getbinary Xonotic/xonotic-dedicated.exe || good=false
$good
;;
release-engine-osx)
release-engine-linux32)
release_common
good=true
- verbose "$SELF" release-getbinary Xonotic/xonotic-linux32-glx || good=false
verbose "$SELF" release-getbinary Xonotic/xonotic-linux32-sdl || good=false
+ verbose "$SELF" release-getbinary Xonotic/xonotic-linux32-glx || good=false
verbose "$SELF" release-getbinary Xonotic/xonotic-linux32-dedicated || good=false
$good
;;
release-engine-linux64)
release_common
good=true
- verbose "$SELF" release-getbinary Xonotic/xonotic-linux64-glx || good=false
verbose "$SELF" release-getbinary Xonotic/xonotic-linux64-sdl || good=false
+ verbose "$SELF" release-getbinary Xonotic/xonotic-linux64-glx || good=false
verbose "$SELF" release-getbinary Xonotic/xonotic-linux64-dedicated || good=false
$good
;;
$ECHO " $SELF compile-map mapname1 mapname2... (e.g. \"./all compile-map dance drain fuse\")"
handled=false
;;
+ serverbench)
+ # TODO(rpolzer): Why does :anticheat: output differ? Total game time differs? Why?
+ verbose "$SELF" run "$@" -noconfig -nohome +exec serverbench.cfg |\
+ tee /dev/stderr |\
+ grep '^:' |\
+ grep -v '^:gamestart:' |\
+ grep -v '^:anticheat:' |\
+ md5sum
+ ;;
*)
handled=false
;;
+++ /dev/null
-#!/bin/sh
-
-d=`pwd`
-t=`mktemp -d -t change-icon-of-exe.XXXXXX`
-cp "$1" "$t/darkplaces-icon.ico"
-cp "$2" "$t/darkplaces.exe"
-cat >"$t/darkplaces.rc" <<EOF
-#include <windows.h> // include for version info constants
-
-A ICON MOVEABLE PURE LOADONCALL DISCARDABLE "darkplaces-icon.ico"
-
-1 VERSIONINFO
-FILEVERSION 1,0,0,0
-PRODUCTVERSION 1,0,0,0
-FILETYPE VFT_APP
-{
- BLOCK "StringFileInfo"
- {
- BLOCK "040904E4"
- {
- VALUE "CompanyName", "Forest Hale Digital Services"
- VALUE "FileVersion", "1.0"
- VALUE "FileDescription", "DarkPlaces Game Engine"
- VALUE "InternalName", "darkplaces.exe"
- VALUE "LegalCopyright", "id Software, Forest Hale, and contributors"
- VALUE "LegalTrademarks", ""
- VALUE "OriginalFilename", "darkplaces.exe"
- VALUE "ProductName", "DarkPlaces"
- VALUE "ProductVersion", "1.0"
- }
- }
-}
-EOF
-cd "$t"
-wine "c:/Program Files/ResEdit/ResEdit.exe" -convert darkplaces.rc darkplaces.exe
-cd "$d"
-mv "$t/darkplaces.exe" "$2"
-rm -rf "$t"
[uchar8 => 'parm_size'],
];
+use constant LNOHEADER_T => [
+ [int => 'lnotype'],
+ [int => 'version'],
+ [int => 'numglobaldefs'],
+ [int => 'numglobals'],
+ [int => 'numfielddefs'],
+ [int => 'numstatements'],
+];
+
+use constant LNO_T => [
+ [int => 'v'],
+];
+
sub get_section($$$)
{
my ($fh, $start, $len) = @_;
elsif($c->{iscall})
{
my $func = $s->{a};
- my $funcid = $progs->{globals}[$func]{v}{int};
last
- if $progs->{error_func}{$funcid};
+ if $progs->{builtins}{error}{$func};
$ip += 1;
}
elsif($c->{isjump})
$nfa->($ip, $copy_handler->($state));
}
-sub get_constant($$)
+sub get_constant($$$)
{
- my ($progs, $g) = @_;
- if($g->{int} == 0)
- {
- return 0;
- }
- elsif($g->{int} > 0 && $g->{int} < 8388608)
- {
- if($g->{int} < length $progs->{strings} && $g->{int} > 0)
- {
- return str($progs->{getstring}->($g->{int}));
- }
- else
- {
- return $g->{int} . "i";
- }
- }
- else
- {
- return $g->{float};
+ my ($progs, $g, $type) = @_;
+
+ if (!defined $type) {
+ $type = 'float';
+ $type = 'int'
+ if $g->{int} > 0 && $g->{int} < 8388608;
+ $type = 'string'
+ if $g->{int} > 0 && $g->{int} < length $progs->{strings};
}
+
+ return str($progs->{getstring}->($g->{int}))
+ if $type eq 'string';
+ return $g->{float}
+ if $type eq 'float';
+ return "'$g->{float} _ _'"
+ if $type eq 'vector';
+ return "entity $g->{int}"
+ if $type eq 'entity';
+ return ".$progs->{entityfieldnames}[$g->{int}][0]"
+ if $type eq 'field' and defined $progs->{entityfieldnames}[$g->{int}][0];
+ return "$g->{int}i"
+ if $type eq 'int';
+
+ return "$type($g->{int})";
}
use constant PRE_MARK_STATEMENT => "";
return "\"$str\"";
}
+sub debugpos($$$) {
+ my ($progs, $func, $ip) = @_;
+ my $s = $func->{debugname};
+ if ($progs->{cno}) {
+ my $column = $progs->{cno}[$ip]{v};
+ $s =~ s/:/:$column:/;
+ }
+ if ($progs->{lno}) {
+ my $line = $progs->{lno}[$ip]{v};
+ $s =~ s/:/:$line:/;
+ }
+ return $s;
+}
+
sub disassemble_function($$;$)
{
my ($progs, $func, $highlight) = @_;
my $initializer = sub
{
my ($ofs) = @_;
- my $g = get_constant($progs, $progs->{globals}[$ofs]{v});
+ # TODO: Can we know its type?
+ my $g = get_constant($progs, $progs->{globals}[$ofs]{v}, undef);
print " = $g"
if defined $g;
};
{
print PRE_MARK_STATEMENT;
printf INSTRUCTION_FORMAT, '', '<!>', '.WARN';
- printf OPERAND_FORMAT, "$_ (in $func->{debugname})";
+ my $pos = debugpos $progs, $func, $ip;
+ printf OPERAND_FORMAT, "$_ (in $pos)";
print INSTRUCTION_SEPARATOR;
}
}
}
}
}
-
+
+ my %solid_seen = ();
+ run_nfa $progs, $func->{first_statement}, do { my $state = -1; \$state; },
+ sub
+ {
+ my $state = ${$_[0]};
+ return \$state;
+ },
+ sub
+ {
+ my ($ip, $state) = @_;
+ return $solid_seen{"$ip $$state"}++;
+ },
+ sub
+ {
+ my ($ip, $state, $s, $c) = @_;
+
+ if($s->{op} eq 'ADDRESS')
+ {
+ my $field_ptr_ofs = $s->{b};
+ my $def = $progs->{globaldef_byoffset}->($field_ptr_ofs);
+ use Data::Dumper;
+ if (($def->{globaltype} eq 'read_only' || $def->{globaltype} eq 'const') &&
+ grep { $_ eq 'solid' } @{$progs->{entityfieldnames}[$progs->{globals}[$field_ptr_ofs]{v}{int}]})
+ {
+ # Taking address of 'solid' for subsequent write!
+ # TODO check if this address is then actually used in STOREP.
+ $$state = $ip;
+ }
+ }
+
+ if($c->{iscall})
+ {
+ # TODO check if the entity passed is actually the one on which solid was set.
+ my $func = $s->{a};
+ if ($progs->{builtins}{setmodel}{$func} || $progs->{builtins}{setmodelindex}{$func} || $progs->{builtins}{setorigin}{$func} || $progs->{builtins}{setsize}{$func})
+ {
+ # All is clean.
+ $$state = -1;
+ }
+ }
+
+ if($c->{isreturn})
+ {
+ if ($$state >= 0) {
+ ++$warned{$$state}{''}{"Changing .solid without setmodel/setmodelindex/setorigin/setsize breaks area grid linking in Quake [write is here]"};
+ ++$warned{$ip}{''}{"Changing .solid without setmodel/setmodelindex/setorigin/setsize breaks area grid linking in Quake [return is here]"};
+ }
+ }
+
+ return 0;
+ };
+
disassemble_function($progs, $func, \%warned)
if keys %warned;
}
my $type = $_->{type};
my $name = $progs->{getstring}->($_->{s_name});
$name = ''
- if $name eq 'IMMEDIATE' or $name =~ /^\./;
+ if $name eq 'IMMEDIATE'; # for fteqcc I had: or $name =~ /^\./;
$_->{debugname} = $name
if $name ne '';
$globalflags[$_->{ofs}] |= GLOBALFLAG_D;
}
elsif($_->{globaltype} eq 'const')
{
- $_->{debugname} = get_constant($progs, $progs->{globals}[$_->{ofs}]{v});
+ $_->{debugname} = get_constant($progs, $progs->{globals}[$_->{ofs}]{v}, $_->{type}{type});
}
else
{
};
}
-sub parse_progs($)
+sub parse_progs($$)
{
- my ($fh) = @_;
+ my ($fh, $lnofh) = @_;
my %p = ();
print STDERR "Parsing header...\n";
$p{header} = parse_section $fh, DPROGRAMS_T, 0, undef, 1;
+ if (defined $lnofh) {
+ print STDERR "Parsing LNO...\n";
+ my $lnoheader = parse_section $lnofh, LNOHEADER_T, 0, undef, 1;
+ eval {
+ die "Not a LNOF"
+ if $lnoheader->{lnotype} != unpack 'V', 'LNOF';
+ die "Not version 1"
+ if $lnoheader->{version} != 1;
+ die "Not same count of globaldefs"
+ if $lnoheader->{numglobaldefs} != $p{header}{numglobaldefs};
+ die "Not same count of globals"
+ if $lnoheader->{numglobals} != $p{header}{numglobals};
+ die "Not same count of fielddefs"
+ if $lnoheader->{numfielddefs} != $p{header}{numfielddefs};
+ die "Not same count of statements"
+ if $lnoheader->{numstatements} != $p{header}{numstatements};
+ $p{lno} = [parse_section $lnofh, LNO_T, 24, undef, $lnoheader->{numstatements}];
+ eval {
+ $p{lno} = [parse_section $lnofh, LNO_T, 24, undef, $lnoheader->{numstatements} * 2];
+ $p{cno} = [splice $p{lno}, $lnoheader->{numstatements}];
+ print STDERR "Cool, this LNO even has column number info!\n";
+ };
+ } or warn "Skipping LNO: $@";
+ }
+
print STDERR "Parsing strings...\n";
$p{strings} = get_section $fh, $p{header}{ofs_strings}, $p{header}{numstrings};
$p{getstring} = sub
my $name = $p{getstring}->($g->{s_name});
die "Out of range ofs $g->{ofs} in fielddef $_ (name: \"$name\")"
if $g->{ofs} >= $p{header}{entityfields};
+ push @{$p{entityfieldnames}[$g->{ofs}]}, $name;
}
print STDERR "Parsing statements...\n";
}
}
- print STDERR "Looking for error()...\n";
- $p{error_func} = {};
+ print STDERR "Looking for error(), setmodel(), setmodelindex(), setorigin(), setsize()...\n";
+ $p{builtins} = { error => {}, setmodel => {}, setmodelindex => {}, setorigin => {}, setsize => {} };
for(@{$p{globaldefs}})
{
+ my $name = $p{getstring}($_->{s_name});
next
- if $p{getstring}($_->{s_name}) ne 'error';
+ if not exists $p{builtins}{$name};
my $v = $p{globals}[$_->{ofs}]{v}{int};
next
if $v <= 0 || $v >= @{$p{functions}};
my $first = $p{functions}[$v]{first_statement};
next
if $first >= 0;
- print STDERR "Detected error() at offset $_->{ofs} (builtin #@{[-$first]})\n";
- $p{error_func}{$_->{ofs}} = 1;
+ print STDERR "Detected $name() at offset $_->{ofs} (builtin #@{[-$first]})\n";
+ $p{builtins}{$name}{$_->{ofs}} = 1;
}
print STDERR "Scanning functions...\n";
}
}
-open my $fh, '<', $ARGV[0];
-parse_progs $fh;
+for my $progs (@ARGV) {
+ my $lno = "$progs.lno";
+ $lno =~ s/\.dat\.lno$/.lno/;
+
+ open my $fh, '<', $progs
+ or die "$progs: $!";
+
+ open my $lnofh, '<', $lno
+ or warn "$lno: $!";
+
+ parse_progs $fh, $lnofh;
+}
if "%ProgramFiles(x86)%" == "" goto bit32\r
:bit64\r
if not "%XONOTIC_INCLUDE_32BIT%" == "" goto endbit\r
- set excludes=%excludes% --exclude=/xonotic.exe\r
- set excludes=%excludes% --exclude=/xonotic-sdl.exe\r
- set excludes=%excludes% --exclude=/xonotic-dedicated.exe\r
+ set excludes=%excludes% --exclude=/xonotic-x86.exe\r
+ set excludes=%excludes% --exclude=/xonotic-x86-wgl.exe\r
+ set excludes=%excludes% --exclude=/xonotic-x86-dedicated.exe\r
set excludes=%excludes% --exclude=/gmqcc/gmqcc.exe\r
set excludes=%excludes% --exclude=/bin32\r
set excludes=%excludes% --exclude=/*.dll\r
goto endbit\r
:bit32\r
- set excludes=%excludes% --exclude=/xonotic-x64.exe\r
- set excludes=%excludes% --exclude=/xonotic-x64-sdl.exe\r
- set excludes=%excludes% --exclude=/xonotic-x64-dedicated.exe\r
+ set excludes=%excludes% --exclude=/xonotic.exe\r
+ set excludes=%excludes% --exclude=/xonotic-wgl.exe\r
+ set excludes=%excludes% --exclude=/xonotic-dedicated.exe\r
set excludes=%excludes% --exclude=/gmqcc/gmqcc-x64.exe\r
set excludes=%excludes% --exclude=/bin64\r
goto endbit\r
if "%ProgramFiles(x86)%" == "" goto bit32\r
:bit64\r
if not "%XONOTIC_INCLUDE_32BIT%" == "" goto endbit\r
- set excludes=%excludes% --exclude=/xonotic.exe\r
- set excludes=%excludes% --exclude=/xonotic-sdl.exe\r
- set excludes=%excludes% --exclude=/xonotic-dedicated.exe\r
+ set excludes=%excludes% --exclude=/xonotic-x86.exe\r
+ set excludes=%excludes% --exclude=/xonotic-x86-wgl.exe\r
+ set excludes=%excludes% --exclude=/xonotic-x86-dedicated.exe\r
set excludes=%excludes% --exclude=/gmqcc/gmqcc.exe\r
set excludes=%excludes% --exclude=/bin32\r
set excludes=%excludes% --exclude=/*.dll\r
goto endbit\r
:bit32\r
- set excludes=%excludes% --exclude=/xonotic-x64.exe\r
- set excludes=%excludes% --exclude=/xonotic-x64-sdl.exe\r
- set excludes=%excludes% --exclude=/xonotic-x64-dedicated.exe\r
+ set excludes=%excludes% --exclude=/xonotic.exe\r
+ set excludes=%excludes% --exclude=/xonotic-wgl.exe\r
+ set excludes=%excludes% --exclude=/xonotic-dedicated.exe\r
set excludes=%excludes% --exclude=/gmqcc/gmqcc-x64.exe\r
set excludes=%excludes% --exclude=/bin64\r
goto endbit\r