| Home Page | Recent Changes | Preferences

Dezro/99 Bottles

Sing 99 Bottles of Beer

And this is the last place I'm putting this thing. I swear.

Inspired by http://99-bottles-of-beer.ls-la.net/

// 99 Bottles of Beer, in UnrealScript. Sings to every player
// simultaneously. Written for UT2003, but would work on other Unreal
// Engine games with little to no modification.
// Probably works on a network. I haven't checked.

// Written by "Dezro" Dave Smith: dezro@mac.com

class MutBottlesBeer extends Mutator;

var int StartingBottles;
var int CurrentBottle;
var int SongLine;
var bool Begun;
var bool StopSong;

function ModifyPlayer(Pawn Other)
{
    Super.ModifyPlayer(Other);
    if (!Begun)
    {
        CurrentBottle = StartingBottles;
        SetTimer(1.5, true);
        Begun = true;
    }
}

function Timer()
{
    local Controller C;
    local bool PassAround;

    if (StopSong)
    {
        SetTimer(0.001, false);
        return;
    }

    for (C = Level.ControllerList; C != None; C = C.NextController)
    {
        Switch (SongLine)
        {
        Case 0:
            if (CurrentBottle == 1)
                C.Pawn.ClientMessage("One bottle of beer on the wall,");
            else
                C.Pawn.ClientMessage(CurrentBottle $ " bottles of beer on the wall,");
            Break;
        Case 1:
            if (CurrentBottle == 1)
                C.Pawn.ClientMessage("One bottle of beer.");
            else
                C.Pawn.ClientMessage(CurrentBottle $ " bottles of beer.");
            Break;
        Case 2:
            if (CurrentBottle == 1)
                C.Pawn.ClientMessage("Take it down, pass it around,");
            else
                C.Pawn.ClientMessage("Take one down, pass it around,");
            PassAround = true;
            Break;
        Default:
            if (CurrentBottle == 1)
                C.Pawn.ClientMessage("One bottle of beer on the wall.");
            else if (CurrentBottle < 1)
            {
                C.Pawn.ClientMessage("No more bottles of beer on the wall!");
                StopSong = true;
            }
            else
                C.Pawn.ClientMessage(CurrentBottle $ " bottles of beer on the wall.");
            Break;
        }
    }
    if (PassAround)
    {
        CurrentBottle--;
        PassAround = false;
    }
    SongLine++;
    if (SongLine > 3)
        SongLine = 0;
}

defaultproperties {
    FriendlyName="99 Bottles"
    Description="Sings to you during the battle."
    StartingBottles = 99
}

Comments

Wormbo: Nice. Actually you could optimize and localize it with LocalMessages, since the song also exists in other languages. :)

Tarquin: Submit it to http://99-bottles-of-beer.ls-la.net/ ! Can you have arrays of strings? Might be neater than using the "switch" statement.

Dezro: I've already submitted it. I didn't use LocalMessages, since I wanted to keep it down to one file. I didn't use string arrays, because I didn't think of it. I should have... I could have added some customization if I went that route, too, which would make up for the lack of localization a bit. Ah, well.

Ike Bart: I tried to compile it in UnrealEd 2 and I got an error on line 29. It said: Error in MutBottlesBeer, Line 29: Unrecognized type 'Controller.' Since I'm an absolute newbie at Unreal script for Unreal Tournament, I'd like to know what to do to make it compatible with Unreal Tournament.

Dezro: That's the "little modification" I was talking about. UT1 doesn't use the pawn/controller setup, so you'd have to change some things. Make the following changes to the code:

Wherever you find this Replace it with this
local Controller C; local Pawn P;
for (C = Level.ControllerList; C != None; C = C.NextController) for (P = Level.PawnList; P != None; P = P.NextPawn)
C.Pawn.ClientMessage P.ClientMessage

Ike Bart: After making those changes, I get an error message at line 84. It said: Error in MutBottlesBeer, Line 84: Unexpected 'defaultproperties'

Dezro: That's a different problem. You're not supposed to use UnrealEd when coding. If you stll want to, remove the "var int StartingBottles;" line, replace every other instance of "StartingBottles" with 99, and delete the "defaultproperties" block. It'll compile after that, probably.

Ike Bart: Thanks for the suggestion, Dezro. I got UnrealEd to compile the script after following your suggestions. Now I have to test it out in Unreal Tournament. I hope I made the .ini file for it correctly.

Ike Bart: I tested it out in Unreal Tournament and it works. It took around nine minutes to finish off all 99 bottles of beer.

The Unreal Engine Documentation Site

Wiki Community

Topic Categories

Image Uploads

Random Page

Recent Changes

Offline Wiki

Unreal Engine

Console Commands

Terminology

FAQs

Help Desk

Mapping Topics

Mapping Lessons

UnrealEd Interface

UnrealScript Topics

UnrealScript Lessons

Making Mods

Class Tree

Modeling Topics

Chongqing Page

Log In