[colobot] 19/377: Restored old Ceebot-Teen objects

Didier Raboud odyx at moszumanska.debian.org
Wed Mar 30 13:33:53 UTC 2016


This is an automated email from the git hooks/post-receive script.

odyx pushed a commit to branch debian/master
in repository colobot.

commit 2cb2782c9d6fd83c9ce0f9fcf35633a54c99b9f7
Author: krzys-h <krzys_h at interia.pl>
Date:   Mon Sep 28 22:08:04 2015 +0200

    Restored old Ceebot-Teen objects
    
    In preparations for new programming course
---
 data                              |   2 +-
 src/CMakeLists.txt                |   1 +
 src/graphics/engine/particle.cpp  |   6 +-
 src/graphics/engine/pyro.cpp      |  27 +-
 src/level/parser/parserparam.cpp  |  90 ++++
 src/object/auto/autokid.cpp       | 204 +++++++++
 src/object/auto/autokid.h         |  48 +++
 src/object/object_factory.cpp     | 846 ++++++++++++++++++++++++++++++++++++++
 src/object/object_factory.h       |   1 +
 src/object/object_type.h          |  45 ++
 src/object/old_object.cpp         |   3 +-
 src/object/task/taskterraform.cpp |   5 +-
 src/script/cbottoken.cpp          |   1 +
 src/ui/controls/map.cpp           |  26 +-
 14 files changed, 1294 insertions(+), 11 deletions(-)

diff --git a/data b/data
index 14518ff..d90d0da 160000
--- a/data
+++ b/data
@@ -1 +1 @@
-Subproject commit 14518ff47694de5bf13a5f43826187cf3d8e40a1
+Subproject commit d90d0da944ad77e461dbc7b623491016f952fc21
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 5e445a9..5386509 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -147,6 +147,7 @@ set(BASE_SOURCES
     object/auto/autoflag.cpp
     object/auto/autohouston.cpp
     object/auto/autojostle.cpp
+    object/auto/autokid.cpp
     object/auto/autolabo.cpp
     object/auto/automush.cpp
     object/auto/autonest.cpp
diff --git a/src/graphics/engine/particle.cpp b/src/graphics/engine/particle.cpp
index afd9f4d..1903554 100644
--- a/src/graphics/engine/particle.cpp
+++ b/src/graphics/engine/particle.cpp
@@ -67,7 +67,9 @@ bool IsAlien(ObjectType type)
              type == OBJECT_NEST     ||
              type == OBJECT_BULLET   ||
              type == OBJECT_EGG      ||
-             type == OBJECT_MOBILEtg );
+             type == OBJECT_MOBILEtg ||
+             type == OBJECT_TEEN28   ||
+             type == OBJECT_TEEN31   );
 }
 
 CParticle::CParticle(CEngine* engine)
@@ -3611,6 +3613,8 @@ CObject* CParticle::SearchObjectRay(Math::Vector pos, Math::Vector goal,
 
         if ( type  == PARTIRAY1       &&
              oType != OBJECT_MOBILEtg &&
+             oType != OBJECT_TEEN28   &&
+             oType != OBJECT_TEEN31   &&
              oType != OBJECT_ANT      &&
              oType != OBJECT_SPIDER   &&
              oType != OBJECT_BEE      &&
diff --git a/src/graphics/engine/pyro.cpp b/src/graphics/engine/pyro.cpp
index 6803890..a0f962c 100644
--- a/src/graphics/engine/pyro.cpp
+++ b/src/graphics/engine/pyro.cpp
@@ -119,6 +119,12 @@ bool CPyro::Create(PyroType type, CObject* obj, float force)
     m_lastParticleSmoke = 0.0f;
     m_lightRank = -1;
 
+    if ( oType == OBJECT_TEEN28 ||
+         oType == OBJECT_TEEN31 )
+    {
+        m_pos.y = pos.y+1.0f;
+    }
+
     // Seeking the position of the battery.
 
     CObject* power = nullptr;
@@ -456,7 +462,9 @@ bool CPyro::Create(PyroType type, CObject* obj, float force)
          m_type == PT_FRAGW  ||
          m_type == PT_SPIDER ||
          m_type == PT_EGG    ||
-        (m_type == PT_EXPLOT && oType == OBJECT_MOBILEtg) )
+        (m_type == PT_EXPLOT && oType == OBJECT_MOBILEtg) ||
+        (m_type == PT_EXPLOT && oType == OBJECT_TEEN28  ) ||
+        (m_type == PT_EXPLOT && oType == OBJECT_TEEN31  ) )
     {
         for (int part = 0; part < OBJECTMAXPART; part++)
         {
@@ -1414,7 +1422,8 @@ void CPyro::CreateTriangle(CObject* obj, ObjectType oType, int part)
         oType == OBJECT_ATOMIC   ||
         oType == OBJECT_URANIUM  ||
         oType == OBJECT_TNT      ||
-        oType == OBJECT_BOMB     )
+        oType == OBJECT_BOMB     ||
+        oType == OBJECT_TEEN28)
     {
         percent = 0.75f;
     }
@@ -1720,6 +1729,15 @@ void CPyro::BurnStart()
         angle.y = 0.0f;
         angle.z = (Math::Rand()-0.5f)*0.4f;
     }
+    else if ( m_burnType == OBJECT_TEEN31 )  // basket?
+    {
+        pos.x =   0.0f;
+        pos.y =   0.0f;
+        pos.z =   0.0f;
+        angle.x = (Math::Rand()-0.5f)*0.8f;
+        angle.y = 0.0f;
+        angle.z = (Math::Rand()-0.5f)*0.2f;
+    }
     else
     {
         pos.x =   0.0f;
@@ -2094,6 +2112,11 @@ void CPyro::BurnAddPart(int part, Math::Vector pos, Math::Vector angle)
 
 void CPyro::BurnProgress()
 {
+    if ( m_burnType == OBJECT_TEEN31 )  // basket?
+    {
+        m_object->SetScaleY(1.0f-m_progress*0.5f);  // slight flattening
+    }
+
     for (int i = 0; i < m_burnPartTotal; i++)
     {
         Math::Vector pos = m_burnPart[i].initialPos + m_progress*(m_burnPart[i].finalPos-m_burnPart[i].initialPos);
diff --git a/src/level/parser/parserparam.cpp b/src/level/parser/parserparam.cpp
index 1933f84..e6c361e 100644
--- a/src/level/parser/parserparam.cpp
+++ b/src/level/parser/parserparam.cpp
@@ -467,6 +467,51 @@ ObjectType CLevelParserParam::ToObjectType(std::string value)
     if (value == "Barrier1"          ) return OBJECT_BARRIER1;
     if (value == "Barrier2"          ) return OBJECT_BARRIER2;
     if (value == "Barrier3"          ) return OBJECT_BARRIER3;
+    if (value == "Teen0"             ) return OBJECT_TEEN0;
+    if (value == "Teen1"             ) return OBJECT_TEEN1;
+    if (value == "Teen2"             ) return OBJECT_TEEN2;
+    if (value == "Teen3"             ) return OBJECT_TEEN3;
+    if (value == "Teen4"             ) return OBJECT_TEEN4;
+    if (value == "Teen5"             ) return OBJECT_TEEN5;
+    if (value == "Teen6"             ) return OBJECT_TEEN6;
+    if (value == "Teen7"             ) return OBJECT_TEEN7;
+    if (value == "Teen8"             ) return OBJECT_TEEN8;
+    if (value == "Teen9"             ) return OBJECT_TEEN9;
+    if (value == "Teen10"            ) return OBJECT_TEEN10;
+    if (value == "Teen11"            ) return OBJECT_TEEN11;
+    if (value == "Teen12"            ) return OBJECT_TEEN12;
+    if (value == "Teen13"            ) return OBJECT_TEEN13;
+    if (value == "Teen14"            ) return OBJECT_TEEN14;
+    if (value == "Teen15"            ) return OBJECT_TEEN15;
+    if (value == "Teen16"            ) return OBJECT_TEEN16;
+    if (value == "Teen17"            ) return OBJECT_TEEN17;
+    if (value == "Teen18"            ) return OBJECT_TEEN18;
+    if (value == "Teen19"            ) return OBJECT_TEEN19;
+    if (value == "Teen20"            ) return OBJECT_TEEN20;
+    if (value == "Teen21"            ) return OBJECT_TEEN21;
+    if (value == "Teen22"            ) return OBJECT_TEEN22;
+    if (value == "Teen23"            ) return OBJECT_TEEN23;
+    if (value == "Teen24"            ) return OBJECT_TEEN24;
+    if (value == "Teen25"            ) return OBJECT_TEEN25;
+    if (value == "Teen26"            ) return OBJECT_TEEN26;
+    if (value == "Teen27"            ) return OBJECT_TEEN27;
+    if (value == "Teen28"            ) return OBJECT_TEEN28;
+    if (value == "Teen29"            ) return OBJECT_TEEN29;
+    if (value == "Teen30"            ) return OBJECT_TEEN30;
+    if (value == "Teen31"            ) return OBJECT_TEEN31;
+    if (value == "Teen32"            ) return OBJECT_TEEN32;
+    if (value == "Teen33"            ) return OBJECT_TEEN33;
+    if (value == "Stone"             ) return OBJECT_TEEN34;
+    if (value == "Teen35"            ) return OBJECT_TEEN35;
+    if (value == "Teen36"            ) return OBJECT_TEEN36;
+    if (value == "Teen37"            ) return OBJECT_TEEN37;
+    if (value == "Teen38"            ) return OBJECT_TEEN38;
+    if (value == "Teen39"            ) return OBJECT_TEEN39;
+    if (value == "Teen40"            ) return OBJECT_TEEN40;
+    if (value == "Teen41"            ) return OBJECT_TEEN41;
+    if (value == "Teen42"            ) return OBJECT_TEEN42;
+    if (value == "Teen43"            ) return OBJECT_TEEN43;
+    if (value == "Teen44"            ) return OBJECT_TEEN44;
     if (value == "Quartz0"           ) return OBJECT_QUARTZ0;
     if (value == "Quartz1"           ) return OBJECT_QUARTZ1;
     if (value == "Quartz2"           ) return OBJECT_QUARTZ2;
@@ -617,6 +662,51 @@ const std::string CLevelParserParam::FromObjectType(ObjectType value)
     if (value == OBJECT_BARRIER1    ) return "Barrier1";
     if (value == OBJECT_BARRIER2    ) return "Barrier2";
     if (value == OBJECT_BARRIER3    ) return "Barrier3";
+    if (value == OBJECT_TEEN0       ) return "Teen0";
+    if (value == OBJECT_TEEN1       ) return "Teen1";
+    if (value == OBJECT_TEEN2       ) return "Teen2";
+    if (value == OBJECT_TEEN3       ) return "Teen3";
+    if (value == OBJECT_TEEN4       ) return "Teen4";
+    if (value == OBJECT_TEEN5       ) return "Teen5";
+    if (value == OBJECT_TEEN6       ) return "Teen6";
+    if (value == OBJECT_TEEN7       ) return "Teen7";
+    if (value == OBJECT_TEEN8       ) return "Teen8";
+    if (value == OBJECT_TEEN9       ) return "Teen9";
+    if (value == OBJECT_TEEN10      ) return "Teen10";
+    if (value == OBJECT_TEEN11      ) return "Teen11";
+    if (value == OBJECT_TEEN12      ) return "Teen12";
+    if (value == OBJECT_TEEN13      ) return "Teen13";
+    if (value == OBJECT_TEEN14      ) return "Teen14";
+    if (value == OBJECT_TEEN15      ) return "Teen15";
+    if (value == OBJECT_TEEN16      ) return "Teen16";
+    if (value == OBJECT_TEEN17      ) return "Teen17";
+    if (value == OBJECT_TEEN18      ) return "Teen18";
+    if (value == OBJECT_TEEN19      ) return "Teen19";
+    if (value == OBJECT_TEEN20      ) return "Teen20";
+    if (value == OBJECT_TEEN21      ) return "Teen21";
+    if (value == OBJECT_TEEN22      ) return "Teen22";
+    if (value == OBJECT_TEEN23      ) return "Teen23";
+    if (value == OBJECT_TEEN24      ) return "Teen24";
+    if (value == OBJECT_TEEN25      ) return "Teen25";
+    if (value == OBJECT_TEEN26      ) return "Teen26";
+    if (value == OBJECT_TEEN27      ) return "Teen27";
+    if (value == OBJECT_TEEN28      ) return "Teen28";
+    if (value == OBJECT_TEEN29      ) return "Teen29";
+    if (value == OBJECT_TEEN30      ) return "Teen30";
+    if (value == OBJECT_TEEN31      ) return "Teen31";
+    if (value == OBJECT_TEEN32      ) return "Teen32";
+    if (value == OBJECT_TEEN33      ) return "Teen33";
+    if (value == OBJECT_TEEN34      ) return "Stone";
+    if (value == OBJECT_TEEN35      ) return "Teen35";
+    if (value == OBJECT_TEEN36      ) return "Teen36";
+    if (value == OBJECT_TEEN37      ) return "Teen37";
+    if (value == OBJECT_TEEN38      ) return "Teen38";
+    if (value == OBJECT_TEEN39      ) return "Teen39";
+    if (value == OBJECT_TEEN40      ) return "Teen40";
+    if (value == OBJECT_TEEN41      ) return "Teen41";
+    if (value == OBJECT_TEEN42      ) return "Teen42";
+    if (value == OBJECT_TEEN43      ) return "Teen43";
+    if (value == OBJECT_TEEN44      ) return "Teen44";
     if (value == OBJECT_QUARTZ0     ) return "Quartz0";
     if (value == OBJECT_QUARTZ1     ) return "Quartz1";
     if (value == OBJECT_QUARTZ2     ) return "Quartz2";
diff --git a/src/object/auto/autokid.cpp b/src/object/auto/autokid.cpp
new file mode 100644
index 0000000..2cdf323
--- /dev/null
+++ b/src/object/auto/autokid.cpp
@@ -0,0 +1,204 @@
+/*
+ * This file is part of the Colobot: Gold Edition source code
+ * Copyright (C) 2001-2014, Daniel Roux, EPSITEC SA & TerranovaTeam
+ * http://epsiteс.ch; http://colobot.info; http://github.com/colobot
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see http://gnu.org/licenses
+ */
+
+
+#include "object/auto/autokid.h"
+
+#include "graphics/engine/particle.h"
+#include "graphics/engine/water.h"
+
+#include "object/old_object.h"
+
+#include "sound/sound.h"
+
+#include <stdio.h>
+
+
+// Object's constructor.
+
+CAutoKid::CAutoKid(COldObject* object) : CAuto(object)
+{
+    m_soundChannel = -1;
+    Init();
+}
+
+// Object's constructor.
+
+CAutoKid::~CAutoKid()
+{
+    if ( m_soundChannel != -1 )
+    {
+        m_sound->FlushEnvelope(m_soundChannel);
+        m_sound->AddEnvelope(m_soundChannel, 0.0f, 1.0f, 1.0f, SOPER_STOP);
+        m_soundChannel = -1;
+    }
+}
+
+
+// Destroys the object.
+
+void CAutoKid::DeleteObject(bool bAll)
+{
+    CAuto::DeleteObject(bAll);
+}
+
+
+// Initialize the object.
+
+void CAutoKid::Init()
+{
+    Math::Vector    pos;
+
+    m_speed = 1.0f/1.0f;
+    m_progress = 0.0f;
+    m_lastParticle = 0.0f;
+
+    if ( m_type == OBJECT_TEEN36 )  // trunk ?
+    {
+        pos = m_object->GetPosition();
+        m_speed = 1.0f/(1.0f+(Math::Mod(pos.x/10.0f-0.5f, 1.0f)*0.2f));
+        m_progress = Math::Mod(pos.x/10.0f, 1.0f);
+    }
+
+    if ( m_type == OBJECT_TEEN37 )  // boat?
+    {
+        pos = m_object->GetPosition();
+        m_speed = 1.0f/(1.0f+(Math::Mod(pos.x/10.0f-0.5f, 1.0f)*0.2f))*2.5f;
+        m_progress = Math::Mod(pos.x/10.0f, 1.0f);
+    }
+
+    if ( m_type == OBJECT_TEEN38 )  // fan?
+    {
+        if ( m_soundChannel == -1 )
+        {
+//?         m_soundChannel = m_sound->Play(SOUND_MANIP, m_object->GetPosition(0), 1.0f, 0.5f, true);
+            m_bSilent = false;
+        }
+    }
+}
+
+
+// Management of an event.
+
+bool CAutoKid::EventProcess(const Event &event)
+{
+    Math::Vector    vib, pos, speed;
+    Math::Point     dim;
+
+    CAuto::EventProcess(event);
+
+    if ( m_soundChannel != -1 )
+    {
+        if ( m_engine->GetPause() )
+        {
+            if ( !m_bSilent )
+            {
+                m_sound->AddEnvelope(m_soundChannel, 0.0f, 0.5f, 0.1f, SOPER_CONTINUE);
+                m_bSilent = true;
+            }
+        }
+        else
+        {
+            if ( m_bSilent )
+            {
+                m_sound->AddEnvelope(m_soundChannel, 1.0f, 0.5f, 0.1f, SOPER_CONTINUE);
+                m_bSilent = false;
+            }
+        }
+    }
+
+    if ( m_engine->GetPause() )  return true;
+    if ( event.type != EVENT_FRAME )  return true;
+
+    m_progress += event.rTime*m_speed;
+
+    if ( m_type == OBJECT_TEEN36 )  // trunk?
+    {
+        vib.x = 0.0f;
+        vib.y = sinf(m_progress)*1.0f;
+        vib.z = 0.0f;
+        m_object->SetLinVibration(vib);
+
+        vib.x = 0.0f;
+        vib.y = 0.0f;
+        vib.z = sinf(m_progress*0.5f)*0.05f;
+        m_object->SetCirVibration(vib);
+
+        if ( m_lastParticle+m_engine->ParticleAdapt(0.15f) <= m_time )
+        {
+            m_lastParticle = m_time;
+
+            pos = m_object->GetPosition();
+            pos.y = m_water->GetLevel()+1.0f;
+            pos.x += (Math::Rand()-0.5f)*50.0f;
+            pos.z += (Math::Rand()-0.5f)*50.0f;
+            speed.y = 0.0f;
+            speed.x = 0.0f;
+            speed.z = 0.0f;
+            dim.x = 50.0f;
+            dim.y = dim.x;
+            m_particle->CreateParticle(pos, speed, dim, Gfx::PARTIFLIC, 3.0f, 0.0f, 0.0f);
+        }
+    }
+
+    if ( m_type == OBJECT_TEEN37 )  // boat?
+    {
+        vib.x = 0.0f;
+        vib.y = sinf(m_progress)*1.0f;
+        vib.z = 0.0f;
+        m_object->SetLinVibration(vib);
+
+        vib.x = 0.0f;
+        vib.y = 0.0f;
+        vib.z = sinf(m_progress*0.5f)*0.15f;
+        m_object->SetCirVibration(vib);
+
+        if ( m_lastParticle+m_engine->ParticleAdapt(0.15f) <= m_time )
+        {
+            m_lastParticle = m_time;
+
+            pos = m_object->GetPosition();
+            pos.y = m_water->GetLevel()+1.0f;
+            pos.x += (Math::Rand()-0.5f)*20.0f;
+            pos.z += (Math::Rand()-0.5f)*20.0f;
+            speed.y = 0.0f;
+            speed.x = 0.0f;
+            speed.z = 0.0f;
+            dim.x = 20.0f;
+            dim.y = dim.x;
+            m_particle->CreateParticle(pos, speed, dim, Gfx::PARTIFLIC, 3.0f, 0.0f, 0.0f);
+        }
+    }
+
+    if ( m_type == OBJECT_TEEN38 )  // fan?
+    {
+        m_object->SetPartRotationY(1, sinf(m_progress*0.6f)*0.4f);
+        m_object->SetPartRotationX(2, m_progress*5.0f);
+    }
+
+    return true;
+}
+
+
+// Returns an error due the state of the automation.
+
+Error CAutoKid::GetError()
+{
+    return ERR_OK;
+}
diff --git a/src/object/auto/autokid.h b/src/object/auto/autokid.h
new file mode 100644
index 0000000..605587c
--- /dev/null
+++ b/src/object/auto/autokid.h
@@ -0,0 +1,48 @@
+/*
+ * This file is part of the Colobot: Gold Edition source code
+ * Copyright (C) 2001-2014, Daniel Roux, EPSITEC SA & TerranovaTeam
+ * http://epsiteс.ch; http://colobot.info; http://github.com/colobot
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see http://gnu.org/licenses
+ */
+
+// autokid.h
+
+#pragma once
+
+
+#include "object/auto/auto.h"
+
+
+class CAutoKid : public CAuto
+{
+public:
+    CAutoKid(COldObject* object);
+    ~CAutoKid();
+
+    void        DeleteObject(bool bAll=false);
+
+    void        Init();
+    bool        EventProcess(const Event &event);
+    Error       GetError();
+
+protected:
+
+protected:
+    float       m_speed;
+    float       m_progress;
+    float       m_lastParticle;
+    int         m_soundChannel;
+    bool        m_bSilent;
+};
diff --git a/src/object/object_factory.cpp b/src/object/object_factory.cpp
index 484d6a2..b8f86f4 100644
--- a/src/object/object_factory.cpp
+++ b/src/object/object_factory.cpp
@@ -38,6 +38,7 @@
 #include "object/auto/autoegg.h"
 #include "object/auto/autoflag.h"
 #include "object/auto/autojostle.h"
+#include "object/auto/autokid.h"
 #include "object/auto/automush.h"
 #include "object/auto/autoroot.h"
 
@@ -182,6 +183,53 @@ CObjectUPtr CObjectFactory::CreateObject(const ObjectCreateParams& params)
         case OBJECT_MUSHROOM2:
             return CreateMushroom(params);
 
+        case OBJECT_TEEN0:
+        case OBJECT_TEEN1:
+        case OBJECT_TEEN2:
+        case OBJECT_TEEN3:
+        case OBJECT_TEEN4:
+        case OBJECT_TEEN5:
+        case OBJECT_TEEN6:
+        case OBJECT_TEEN7:
+        case OBJECT_TEEN8:
+        case OBJECT_TEEN9:
+        case OBJECT_TEEN10:
+        case OBJECT_TEEN11:
+        case OBJECT_TEEN12:
+        case OBJECT_TEEN13:
+        case OBJECT_TEEN14:
+        case OBJECT_TEEN15:
+        case OBJECT_TEEN16:
+        case OBJECT_TEEN17:
+        case OBJECT_TEEN18:
+        case OBJECT_TEEN19:
+        case OBJECT_TEEN20:
+        case OBJECT_TEEN21:
+        case OBJECT_TEEN22:
+        case OBJECT_TEEN23:
+        case OBJECT_TEEN24:
+        case OBJECT_TEEN25:
+        case OBJECT_TEEN26:
+        case OBJECT_TEEN27:
+        case OBJECT_TEEN28:
+        case OBJECT_TEEN29:
+        case OBJECT_TEEN30:
+        case OBJECT_TEEN31:
+        case OBJECT_TEEN32:
+        case OBJECT_TEEN33:
+        case OBJECT_TEEN34:
+        case OBJECT_TEEN35:
+        case OBJECT_TEEN36:
+        case OBJECT_TEEN37:
+        case OBJECT_TEEN38:
+        case OBJECT_TEEN39:
+        case OBJECT_TEEN40:
+        case OBJECT_TEEN41:
+        case OBJECT_TEEN42:
+        case OBJECT_TEEN43:
+        case OBJECT_TEEN44:
+            return CreateTeen(params);
+
         case OBJECT_QUARTZ0:
         case OBJECT_QUARTZ1:
         case OBJECT_QUARTZ2:
@@ -845,6 +893,798 @@ CObjectUPtr CObjectFactory::CreateMushroom(const ObjectCreateParams& params)
     return std::move(obj);
 }
 
+// Creates a toy placed on the ground.
+
+CObjectUPtr CObjectFactory::CreateTeen(const ObjectCreateParams& params)
+{
+    Math::Vector pos = params.pos;
+    float angle = params.angle;
+    float height = params.height;
+    ObjectType type = params.type;
+    int option = params.option;
+
+    COldObjectUPtr obj{new COldObject(params.id)};
+
+    obj->SetType(type);
+    obj->SetOption(option);
+
+    float fShadow = Math::Norm(1.0f-height/10.0f);
+    bool floorAdjust = true;
+
+    if ( type == OBJECT_TEEN0 )  // orange pencil lg=10
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen0.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 5.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 2.5f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-2.5f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f));
+
+        obj->CreateShadowCircle(5.0f, 0.8f*fShadow, Gfx::ENG_SHADOW_WORM);
+    }
+
+    if ( type == OBJECT_TEEN1 )  // blue pencil lg=14
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen1.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 6.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 4.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 2.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-2.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-4.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-6.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f));
+
+        obj->CreateShadowCircle(6.0f, 0.8f*fShadow, Gfx::ENG_SHADOW_WORM);
+    }
+
+    if ( type == OBJECT_TEEN2 )  // red pencil lg=16
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen2.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 7.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 4.7f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 2.3f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-2.3f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-4.7f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-7.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f));
+
+        obj->CreateShadowCircle(6.0f, 0.8f*fShadow, Gfx::ENG_SHADOW_WORM);
+    }
+
+    if ( type == OBJECT_TEEN3 )  // jar with pencils
+    {
+        int rank = m_engine->CreateObject();
+//?     m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_METAL);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen3.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 4.0f, 0.0f), 4.0f, SOUND_BOUMm, 0.45f));
+        obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 4.0f, 0.0f), 4.0f));
+        obj->CreateShadowCircle(6.0f, 0.5f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN4 )  // scissors
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen4.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-9.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-6.0f, 1.0f, 0.0f), 1.1f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-3.0f, 1.0f, 0.0f), 1.2f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 1.0f, 0.0f), 1.3f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 5.1f, 1.0f,-1.3f), 2.6f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 8.0f, 1.0f, 2.2f), 2.3f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 9.4f, 1.0f,-2.0f), 2.0f, SOUND_BOUMm, 0.45f));
+
+        obj->CreateShadowCircle(10.0f, 0.5f*fShadow, Gfx::ENG_SHADOW_WORM);
+    }
+
+    if ( type == OBJECT_TEEN5 )  // CD
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen5.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+        obj->SetFloorHeight(0.0f);
+        floorAdjust = false;
+
+        m_terrain->AddBuildingLevel(pos, 5.9f, 6.1f, 0.2f, 0.5f);
+        obj->CreateShadowCircle(8.0f, 0.2f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN6 )  // book 1
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen6.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 3.0f, 7.5f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 4.5f, 3.0f, 7.5f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 3.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 4.5f, 3.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 3.0f,-7.5f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 4.5f, 3.0f,-7.5f), 5.0f, SOUND_BOUMm, 0.45f));
+
+        obj->CreateShadowCircle(20.0f, 0.2f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN7 )  // book 2
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen7.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 3.0f, 7.5f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 4.5f, 3.0f, 7.5f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 3.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 4.5f, 3.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 3.0f,-7.5f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 4.5f, 3.0f,-7.5f), 5.0f, SOUND_BOUMm, 0.45f));
+
+        obj->CreateShadowCircle(20.0f, 0.2f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN8 )  // a stack of books 1
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen8.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 3.0f, 7.5f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 4.5f, 3.0f, 7.5f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 3.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 4.5f, 3.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 3.0f,-7.5f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 4.5f, 3.0f,-7.5f), 5.0f, SOUND_BOUMm, 0.45f));
+
+        obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 10.0f, 0.0f), 12.0f));
+        obj->CreateShadowCircle(20.0f, 0.2f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN9 )  // a stack of books 2
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen9.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 3.0f, 7.5f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 4.5f, 3.0f, 7.5f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 3.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 4.5f, 3.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 3.0f,-7.5f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 4.5f, 3.0f,-7.5f), 5.0f, SOUND_BOUMm, 0.45f));
+
+        obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 10.0f, 0.0f), 12.0f));
+        obj->CreateShadowCircle(20.0f, 0.2f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN10 )  // bookcase
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen10.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-26.0f, 3.0f, 0.0f), 6.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-15.0f, 3.0f,-4.0f), 6.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-15.0f, 3.0f, 5.0f), 6.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( -4.0f, 3.0f,-4.0f), 6.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( -4.0f, 3.0f, 5.0f), 6.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(  6.0f, 3.0f,-4.0f), 6.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(  6.0f, 3.0f, 4.0f), 6.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 14.0f, 3.0f,-3.0f), 6.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 14.0f, 3.0f, 2.0f), 6.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 24.0f, 3.0f, 5.0f), 6.0f, SOUND_BOUMm, 0.45f));
+
+        obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 6.0f, 0.0f), 20.0f));
+        obj->CreateShadowCircle(40.0f, 0.2f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN11 )  // lamp
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen11.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+        obj->SetFloorHeight(0.0f);
+
+        Math::Matrix* mat = obj->GetWorldMatrix(0);
+        pos = Math::Transform(*mat, Math::Vector(-56.0f, 22.0f, 0.0f));
+        m_particle->CreateParticle(pos, Math::Vector(0.0f, 0.0f, 0.0f), Math::Point(20.0f, 20.0f), Gfx::PARTISELY, 1.0f, 0.0f, 0.0f);
+
+        pos = Math::Transform(*mat, Math::Vector(-65.0f, 40.0f, 0.0f));
+        /* TODO: ?
+        Gfx::Color color;
+        color.r = 4.0f;
+        color.g = 2.0f;
+        color.b = 0.0f;  // yellow-orange
+        color.a = 0.0f;
+        m_main->CreateSpot(pos, color);
+        */
+    }
+
+    if ( type == OBJECT_TEEN12 )  // coke
+    {
+        int rank = m_engine->CreateObject();
+//?     m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_METAL);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen12.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 4.0f, 0.0f), 4.0f, SOUND_BOUMm, 0.45f));
+        obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 9.0f, 0.0f), 5.0f));
+        obj->CreateShadowCircle(4.5f, 1.0f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN13 )  // cardboard farm
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen13.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-10.0f, 4.0f,-7.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(  0.0f, 4.0f,-7.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 10.0f, 4.0f,-7.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-10.0f, 4.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(  0.0f, 4.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 10.0f, 4.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-10.0f, 4.0f, 7.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(  0.0f, 4.0f, 7.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 10.0f, 4.0f, 7.0f), 5.0f, SOUND_BOUMm, 0.45f));
+
+        obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 5.0f, 0.0f), 15.0f));
+        obj->CreateShadowCircle(20.0f, 1.0f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN14 )  // open box
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen14.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-10.0f, 4.0f,-7.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(  0.0f, 4.0f,-7.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 10.0f, 4.0f,-7.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-10.0f, 4.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(  0.0f, 4.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 10.0f, 4.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-10.0f, 4.0f, 7.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(  0.0f, 4.0f, 7.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 10.0f, 4.0f, 7.0f), 5.0f, SOUND_BOUMm, 0.45f));
+
+        obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 5.0f, 0.0f), 15.0f));
+        obj->CreateShadowCircle(20.0f, 1.0f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN15 )  // stack of cartons
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen15.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-10.0f, 4.0f,-7.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(  0.0f, 4.0f,-7.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 10.0f, 4.0f,-7.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-10.0f, 4.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(  0.0f, 4.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 10.0f, 4.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-10.0f, 4.0f, 7.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(  0.0f, 4.0f, 7.0f), 5.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 10.0f, 4.0f, 7.0f), 5.0f, SOUND_BOUMm, 0.45f));
+
+        obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 5.0f, 0.0f), 15.0f));
+        obj->CreateShadowCircle(20.0f, 1.0f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN16 )  // watering can
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen16.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-8.0f, 4.0f, 0.0f), 12.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 8.0f, 4.0f, 0.0f), 12.0f, SOUND_BOUMm, 0.45f));
+
+        obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 13.0f, 0.0f), 20.0f));
+        obj->CreateShadowCircle(18.0f, 1.0f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN17 )  // wheel |
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen17.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 31.0f, 0.0f), 31.0f, SOUND_BOUMm, 0.45f));
+        obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 31.0f, 0.0f), 31.0f));
+        obj->CreateShadowCircle(24.0f, 0.5f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN18 )  // wheel /
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen18.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 31.0f, 0.0f), 31.0f, SOUND_BOUMm, 0.45f));
+        obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 31.0f, 0.0f), 31.0f));
+        obj->CreateShadowCircle(24.0f, 0.5f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN19 )  // wheel =
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen19.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 10.0f, 0.0f), 32.0f, SOUND_BOUMm, 0.45f));
+        obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 10.0f, 0.0f), 32.0f));
+        obj->CreateShadowCircle(33.0f, 1.0f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN20 )  // wall with shelf
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen20.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-175.0f, 0.0f,  -5.0f), 4.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-175.0f, 0.0f, -35.0f), 4.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( -55.0f, 0.0f,  -5.0f), 4.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( -55.0f, 0.0f, -35.0f), 4.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( -37.0f, 0.0f,  -5.0f), 4.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( -37.0f, 0.0f, -35.0f), 4.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(  83.0f, 0.0f,  -5.0f), 4.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(  83.0f, 0.0f, -35.0f), 4.0f, SOUND_BOUMm, 0.45f));
+    }
+
+    if ( type == OBJECT_TEEN21 )  // wall with window
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen21.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+    }
+
+    if ( type == OBJECT_TEEN22 )  // wall with door and shelf
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen22.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-135.0f, 0.0f,  -5.0f), 4.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-135.0f, 0.0f, -35.0f), 4.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( -15.0f, 0.0f,  -5.0f), 4.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( -15.0f, 0.0f, -35.0f), 4.0f, SOUND_BOUMm, 0.45f));
+    }
+
+    if ( type == OBJECT_TEEN23 )  // skateboard on wheels
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen23.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        if ( option == 1 )  // passage under the prohibited skateboard?
+        {
+            obj->AddCrashSphere(CrashSphere(Math::Vector(-10.0f, 2.0f, 0.0f), 11.0f, SOUND_BOUMm, 0.45f));
+            obj->AddCrashSphere(CrashSphere(Math::Vector( 10.0f, 2.0f, 0.0f), 11.0f, SOUND_BOUMm, 0.45f));
+        }
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-23.0f, 2.0f, 7.0f), 3.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-23.0f, 2.0f, 0.0f), 3.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-23.0f, 2.0f,-7.0f), 3.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 23.0f, 2.0f, 7.0f), 3.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 23.0f, 2.0f, 0.0f), 3.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 23.0f, 2.0f,-7.0f), 3.0f, SOUND_BOUMm, 0.45f));
+
+        obj->CreateShadowCircle(35.0f, 0.8f*fShadow, Gfx::ENG_SHADOW_WORM);
+    }
+
+    if ( type == OBJECT_TEEN24 )  // skate /
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen24.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-12.0f, 0.0f, -3.0f), 3.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-12.0f, 0.0f,  3.0f), 3.0f, SOUND_BOUMm, 0.45f));
+        obj->CreateShadowCircle(20.0f, 0.2f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN25 )  // skate /
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen25.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-12.0f, 0.0f, -3.0f), 3.0f, SOUND_BOUMm, 0.45f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-12.0f, 0.0f,  3.0f), 3.0f, SOUND_BOUMm, 0.45f));
+        obj->CreateShadowCircle(20.0f, 0.2f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN26 )  // ceiling lamp
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen26.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+        obj->SetFloorHeight(0.0f);
+
+        Math::Matrix* mat = obj->GetWorldMatrix(0);
+        pos = Math::Transform(*mat, Math::Vector(0.0f, 50.0f, 0.0f));
+        m_particle->CreateParticle(pos, Math::Vector(0.0f, 0.0f, 0.0f), Math::Point(100.0f, 100.0f), Gfx::PARTISELY, 1.0f, 0.0f, 0.0f);
+
+        /* TODO: ?
+        pos = Math::Transform(*mat, Math::Vector(0.0f, 50.0f, 0.0f));
+        Gfx::Color color;
+        color.r = 4.0f;
+        color.g = 2.0f;
+        color.b = 0.0f;  // yellow-orange
+        color.a = 0.0f;
+        m_main->CreateSpot(pos, color);
+        */
+    }
+
+    if ( type == OBJECT_TEEN27 )  // large plant?
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen27.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 0.0f, 0.0f), 4.0f, SOUND_BOUM, 0.10f));
+        obj->CreateShadowCircle(40.0f, 0.5f);
+    }
+
+    if ( type == OBJECT_TEEN28 )  // bottle?
+    {
+        int rank = m_engine->CreateObject();
+//?     m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_METAL);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen28.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 2.0f, 0.0f), 5.0f, SOUND_BOUM, 0.10f));
+        obj->CreateShadowCircle(7.0f, 0.6f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN29 )  // bridge?
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen29.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+        floorAdjust = false;
+    }
+
+    if ( type == OBJECT_TEEN30 )  // jump?
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen30.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 4.0f, 0.0f), 15.0f, SOUND_BOUM, 0.10f));
+        obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 15.0f, 0.0f), 17.0f));
+        obj->CreateShadowCircle(20.0f, 1.0f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN31 )  // basket?
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen31.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-10.0f, 2.0f, 0.0f), 5.0f, SOUND_BOUM, 0.10f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(  0.0f, 2.0f, 0.0f), 6.0f, SOUND_BOUM, 0.10f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(  9.0f, 4.0f, 1.0f), 6.0f, SOUND_BOUM, 0.10f));
+
+        obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 0.0f, 0.0f), 10.0f));
+        obj->CreateShadowCircle(16.0f, 0.6f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN32 )  // chair?
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen32.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 17.5f, 1.0f,  17.5f), 3.5f, SOUND_BOUM, 0.10f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 17.5f, 1.0f, -17.5f), 3.5f, SOUND_BOUM, 0.10f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-17.5f, 1.0f,  17.5f), 3.5f, SOUND_BOUM, 0.10f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-17.5f, 1.0f, -17.5f), 3.5f, SOUND_BOUM, 0.10f));
+        obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 0.0f, 0.0f), 26.0f));
+        obj->CreateShadowCircle(35.0f, 0.3f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN33 )  // panel?
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen33.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 2.0f, 0.0f), 4.0f, SOUND_BOUM, 0.10f));
+        obj->CreateShadowCircle(10.0f, 0.3f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN34 )  // stone?
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen34.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 2.0f, 0.0f), 4.0f, SOUND_BOUM, 0.10f));
+        obj->CreateShadowCircle(3.0f, 1.0f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN35 )  // pipe?
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen35.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-40.0f, 5.0f, 0.0f), 10.0f, SOUND_BOUM, 0.10f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(-20.0f, 5.0f, 0.0f), 10.0f, SOUND_BOUM, 0.10f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector(  0.0f, 5.0f, 0.0f), 10.0f, SOUND_BOUM, 0.10f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 20.0f, 5.0f, 0.0f), 10.0f, SOUND_BOUM, 0.10f));
+        obj->AddCrashSphere(CrashSphere(Math::Vector( 40.0f, 5.0f, 0.0f), 10.0f, SOUND_BOUM, 0.10f));
+        obj->CreateShadowCircle(40.0f, 0.8f*fShadow, Gfx::ENG_SHADOW_WORM);
+    }
+
+    if ( type == OBJECT_TEEN36 )  // trunk?
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen36.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+        floorAdjust = false;
+    }
+
+    if ( type == OBJECT_TEEN37 )  // boat?
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen37.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+        floorAdjust = false;
+    }
+
+    if ( type == OBJECT_TEEN38 )  // fan?
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen38a.mod", false, rank);
+        obj->SetPartPosition(0, pos);
+        obj->SetPartRotationY(0, angle);
+
+        rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_DESCENDANT);
+        obj->SetObjectRank(1, rank);
+        obj->SetObjectParent(1, 0);
+        m_oldModelManager->AddModelReference("teen38b.mod", false, rank);  // engine
+        obj->SetPartPosition(1, Math::Vector(0.0f, 30.0f, 0.0f));
+
+        rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_DESCENDANT);
+        obj->SetObjectRank(2, rank);
+        obj->SetObjectParent(2, 1);
+        m_oldModelManager->AddModelReference("teen38c.mod", false, rank);  // propeller
+        obj->SetPartPosition(2, Math::Vector(0.0f, 0.0f, 0.0f));
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 2.0f, 0.0f), 10.0f, SOUND_BOUM, 0.10f));
+        obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 2.0f, 0.0f), 10.0f));
+        obj->CreateShadowCircle(15.0f, 0.5f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN39 )  // potted plant?
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen39.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 2.0f, 0.0f), 8.5f, SOUND_BOUM, 0.10f));
+        obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 2.0f, 0.0f), 8.5f));
+        obj->CreateShadowCircle(10.0f, 1.0f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN40 )  // balloon?
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen40.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 5.0f, 0.0f), 11.0f, SOUND_BOUM, 0.10f));
+        obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 14.0f, 0.0f), 15.0f));
+        obj->CreateShadowCircle(15.0f, 0.7f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN41 )  // fence?
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen41.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+    }
+
+    if ( type == OBJECT_TEEN42 )  // clover?
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen42.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 2.0f, 0.0f), 2.0f, SOUND_BOUM, 0.10f));
+        obj->CreateShadowCircle(15.0f, 0.4f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN43 )  // clover?
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen43.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 2.0f, 0.0f), 2.0f, SOUND_BOUM, 0.10f));
+        obj->CreateShadowCircle(15.0f, 0.4f*fShadow);
+    }
+
+    if ( type == OBJECT_TEEN44 )  // car?
+    {
+        int rank = m_engine->CreateObject();
+        m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
+        obj->SetObjectRank(0, rank);
+        m_oldModelManager->AddModelReference("teen44.mod", false, rank);
+        obj->SetPosition(pos);
+        obj->SetRotationY(angle);
+
+        obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 10.0f, 0.0f), 55.0f, SOUND_BOUM, 0.10f));
+        obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 10.0f, 0.0f), 55.0f));
+        obj->CreateShadowCircle(55.0f, 1.0f*fShadow);
+    }
+
+    pos = obj->GetPosition();
+    obj->SetPosition(pos);  // to display the shadows immediately
+
+    if ( floorAdjust )
+    {
+        obj->SetFloorHeight(0.0f);
+        obj->FloorAdjust();
+    }
+
+    AddObjectAuto(obj.get());
+
+    pos = obj->GetPosition();
+    pos.y += height;
+    obj->SetPosition(pos);
+
+    return std::move(obj);
+}
+
 // Creates a crystal placed on the ground.
 
 CObjectUPtr CObjectFactory::CreateQuartz(const ObjectCreateParams& params)
@@ -1719,6 +2559,12 @@ void CObjectFactory::AddObjectAuto(COldObject* obj)
     {
         objAuto = MakeUnique<CAutoFlag>(obj);
     }
+    if ( type == OBJECT_TEEN36 ||  // trunk?
+         type == OBJECT_TEEN37 ||  // boat?
+         type == OBJECT_TEEN38 )   // fan?
+    {
+        objAuto.reset(new CAutoKid(obj));
+    }
 
     if (objAuto != nullptr)
     {
diff --git a/src/object/object_factory.h b/src/object/object_factory.h
index c48b06d..eed5c81 100644
--- a/src/object/object_factory.h
+++ b/src/object/object_factory.h
@@ -62,6 +62,7 @@ private:
     CObjectUPtr CreateBarrier(const ObjectCreateParams& params);
     CObjectUPtr CreatePlant(const ObjectCreateParams& params);
     CObjectUPtr CreateMushroom(const ObjectCreateParams& params);
+    CObjectUPtr CreateTeen(const ObjectCreateParams& params);
     CObjectUPtr CreateQuartz(const ObjectCreateParams& params);
     CObjectUPtr CreateRoot(const ObjectCreateParams& params);
     CObjectUPtr CreateHome(const ObjectCreateParams& params);
diff --git a/src/object/object_type.h b/src/object/object_type.h
index ea4e8f3..2186665 100644
--- a/src/object/object_type.h
+++ b/src/object/object_type.h
@@ -165,6 +165,51 @@ enum ObjectType
     OBJECT_RUINconvert      = 610,  //! < RuinConvert
     OBJECT_RUINbase         = 611,  //! < RuinBaseCamp
     OBJECT_RUINhead         = 612,  //! < RuinHeadCamp
+    OBJECT_TEEN0            = 620,  //! < Teen0
+    OBJECT_TEEN1            = 621,  //! < Teen1
+    OBJECT_TEEN2            = 622,  //! < Teen2
+    OBJECT_TEEN3            = 623,  //! < Teen3
+    OBJECT_TEEN4            = 624,  //! < Teen4
+    OBJECT_TEEN5            = 625,  //! < Teen5
+    OBJECT_TEEN6            = 626,  //! < Teen6
+    OBJECT_TEEN7            = 627,  //! < Teen7
+    OBJECT_TEEN8            = 628,  //! < Teen8
+    OBJECT_TEEN9            = 629,  //! < Teen9
+    OBJECT_TEEN10           = 630,  //! < Teen10
+    OBJECT_TEEN11           = 631,  //! < Teen11
+    OBJECT_TEEN12           = 632,  //! < Teen12
+    OBJECT_TEEN13           = 633,  //! < Teen13
+    OBJECT_TEEN14           = 634,  //! < Teen14
+    OBJECT_TEEN15           = 635,  //! < Teen15
+    OBJECT_TEEN16           = 636,  //! < Teen16
+    OBJECT_TEEN17           = 637,  //! < Teen17
+    OBJECT_TEEN18           = 638,  //! < Teen18
+    OBJECT_TEEN19           = 639,  //! < Teen19
+    OBJECT_TEEN20           = 640,  //! < Teen20
+    OBJECT_TEEN21           = 641,  //! < Teen21
+    OBJECT_TEEN22           = 642,  //! < Teen22
+    OBJECT_TEEN23           = 643,  //! < Teen23
+    OBJECT_TEEN24           = 644,  //! < Teen24
+    OBJECT_TEEN25           = 645,  //! < Teen25
+    OBJECT_TEEN26           = 646,  //! < Teen26
+    OBJECT_TEEN27           = 647,  //! < Teen27
+    OBJECT_TEEN28           = 648,  //! < Teen28
+    OBJECT_TEEN29           = 649,  //! < Teen29
+    OBJECT_TEEN30           = 650,  //! < Teen30
+    OBJECT_TEEN31           = 651,  //! < Teen31
+    OBJECT_TEEN32           = 652,  //! < Teen32
+    OBJECT_TEEN33           = 653,  //! < Teen33
+    OBJECT_TEEN34           = 654,  //! < Stone (Teen34)
+    OBJECT_TEEN35           = 655,  //! < Teen35
+    OBJECT_TEEN36           = 656,  //! < Teen36
+    OBJECT_TEEN37           = 657,  //! < Teen37
+    OBJECT_TEEN38           = 658,  //! < Teen38
+    OBJECT_TEEN39           = 659,  //! < Teen39
+    OBJECT_TEEN40           = 660,  //! < Teen40
+    OBJECT_TEEN41           = 661,  //! < Teen41
+    OBJECT_TEEN42           = 662,  //! < Teen42
+    OBJECT_TEEN43           = 663,  //! < Teen43
+    OBJECT_TEEN44           = 664,  //! < Teen44
     OBJECT_QUARTZ0          = 700,  //! < Quartz0
     OBJECT_QUARTZ1          = 701,  //! < Quartz1
     OBJECT_QUARTZ2          = 702,  //! < Quartz2
diff --git a/src/object/old_object.cpp b/src/object/old_object.cpp
index 2df77bb..d327c7a 100644
--- a/src/object/old_object.cpp
+++ b/src/object/old_object.cpp
@@ -732,7 +732,8 @@ void COldObject::SetType(ObjectType type)
          m_type == OBJECT_ANT      ||
          m_type == OBJECT_WORM     ||
          m_type == OBJECT_SPIDER   ||
-         m_type == OBJECT_BEE       )
+         m_type == OBJECT_BEE      ||
+         m_type == OBJECT_TEEN28    )
     {
         m_implementedInterfaces[static_cast<int>(ObjectInterfaceType::Damageable)] = true;
         m_implementedInterfaces[static_cast<int>(ObjectInterfaceType::Destroyable)] = true;
diff --git a/src/object/task/taskterraform.cpp b/src/object/task/taskterraform.cpp
index 3b6e6ef..f761dba 100644
--- a/src/object/task/taskterraform.cpp
+++ b/src/object/task/taskterraform.cpp
@@ -363,11 +363,8 @@ bool CTaskTerraform::Terraform()
         type = pObj->GetType();
         if ( type == OBJECT_NULL )  continue;
 
-        if ( false )
+        if ( type == OBJECT_TEEN34 )  // stone?
         {
-            // This was used by Ceebot-Teen to destroy objects hit by the Thumper
-            // The old Teen objects are removed, but this code might be reused at some point, e.g. to add destruction of resources like empty batteries
-
             dist = Math::Distance(m_terraPos, pObj->GetPosition());
             if ( dist > 20.0f )  continue;
 
diff --git a/src/script/cbottoken.cpp b/src/script/cbottoken.cpp
index c01b0ec..dc491c5 100644
--- a/src/script/cbottoken.cpp
+++ b/src/script/cbottoken.cpp
@@ -54,6 +54,7 @@ const char* GetObjectName(ObjectType type)
     if ( type == OBJECT_TARGET2     )  return "Target2";
     if ( type == OBJECT_START       )  return "StartArea";
     if ( type == OBJECT_END         )  return "GoalArea";
+    if ( type == OBJECT_TEEN34      )  return "Stone";
     if ( type == OBJECT_STONE       )  return "TitaniumOre";
     if ( type == OBJECT_URANIUM     )  return "UraniumOre";
     if ( type == OBJECT_METAL       )  return "Titanium";
diff --git a/src/ui/controls/map.cpp b/src/ui/controls/map.cpp
index 1e96404..c80c631 100644
--- a/src/ui/controls/map.cpp
+++ b/src/ui/controls/map.cpp
@@ -619,6 +619,18 @@ void CMap::DrawObject(Math::Point pos, float dir, ObjectType type, MapColor colo
         dim.x *= 1.4f;
         dim.y *= 1.4f;
     }
+    if ( type == OBJECT_TEEN28 )  // bottle?
+    {
+        dim.x *= 3.0f;
+        dim.y *= 3.0f;
+        bHilite = true;
+    }
+    if ( type == OBJECT_TEEN34 )  // stone?
+    {
+        dim.x *= 2.0f;
+        dim.y *= 2.0f;
+        bHilite = true;
+    }
 
     if ( color == MAPCOLOR_MOVE && bSelect )
     {
@@ -868,6 +880,8 @@ void CMap::DrawObjectIcon(Math::Point pos, Math::Point dim, MapColor color,
         if ( type == OBJECT_SPIDER   )  icon = 31;
         if ( type == OBJECT_BEE      )  icon = 31;
         if ( type == OBJECT_WORM     )  icon = 31;
+        if ( type == OBJECT_TEEN28    )  icon = 48;  // bottle
+        if ( type == OBJECT_TEEN34    )  icon = 48;  // stone
         if ( icon == -1 )  return;
 
         m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE);
@@ -1187,7 +1201,9 @@ void CMap::UpdateObject(CObject* pObj)
          type == OBJECT_HUSTON   ||
          type == OBJECT_TARGET1  ||
          type == OBJECT_START    ||
-         type == OBJECT_END      )  // stationary object?
+         type == OBJECT_END      ||  // stationary object?
+         type == OBJECT_TEEN28    ||  // bottle?
+         type == OBJECT_TEEN34    )   // stone?
     {
         color = MAPCOLOR_FIX;
     }
@@ -1264,7 +1280,13 @@ void CMap::UpdateObject(CObject* pObj)
 
     if (!m_fixImage.empty() && !m_bDebug)  // map with still image?
     {
-        if ( color != MAPCOLOR_MOVE )  return;
+        if ( (type == OBJECT_TEEN28 ||
+              type == OBJECT_TEEN34 ) &&
+             m_mode == 0 )  return;
+
+        if ( type != OBJECT_TEEN28 &&
+             type != OBJECT_TEEN34 &&
+             color != MAPCOLOR_MOVE )  return;
     }
 
     if ( pObj->Implements(ObjectInterfaceType::Controllable) && dynamic_cast<CControllableObject*>(pObj)->GetSelect() )

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/colobot.git



More information about the Pkg-games-commits mailing list