Anlatı (veya en azından uzamsal-zaman odaklı olmayan) odaklı motorlar / çerçeveler var mı? [kapalı]


9

DÜZENLEME (2): İki cevap olduğundan ve hiçbirini kabul etmediğimden, burada cevap olarak neyi düşündüğümü motive edeceğimi düşündüm: Ya böyle bir yaklaşımı güçlü bir şekilde öneren bir şey imkansız / hiç de yararlı olmayacak veya alternatif olarak, bir araştırmaya (alana) veya metin macera oyunları / etkileşimli kurgu ötesinde en azından biraz genel bir sisteme referans.

Daha derin bir araştırma yaptığımı taklit etmeme rağmen, baktığım tüm oyun motorlarının / çerçevelerinin, ikisinde şekil / varlıklardan bahsettikleri için yüceltilmiş bir grafik motoru gibi göründüğünü fark ettim. veya üç boyutlu öklid uzayına sahip olabilir, muhtemelen bu "varlıklara" bağlı bir çeşit mantık biçimini belirtmeye izin veren "takılı" bir çeşit eşzamanlılık modeli.

Oyun "kurallar" ve anlatı daha sonra bu ilkellerin üzerine biraz geçici (motora göre) yazılır.

Açıkçası yukarıdaki açıklama oldukça basitleştirilmiştir (bir çeşit görev / anlatı sistemi içeren sonsuzluk motoru gibi daha özel motorlar alın) ve bu modelin oldukça iyi çalışabileceğini (birçok insanın bunu kullandığını görüyorum) .

Yine de, oyun kuralları / mantık veya anlatı (veya oyunun en azından mekansal olmayan bir yönü ) gibi (yüksek düzeyde) kavramları birincil olarak kabul eden motorlar / çerçeveler oluşturmak için hangi girişimlerin yapıldığını merak ediyorum. temeli?

DÜZENLEME (4): Bu, oyunun herhangi bir uzamsal / grafiksel yönü içermeyeceği anlamına gelmez, sadece mantığı ilişkilendirdiğiniz uzamsal varlıklara sahip olmaktan ziyade, bir arsa (veya oyun veya "masa oyunu kuralları" kavramına sahip olduğunuz anlamına gelir) ) daha sonra / gerçekleştirilmesi için bir grafik arabirim tanımlayabilirsiniz.

Özellikle, oldukça büyük bir oyun sınıfının bir tür (yarı) biçimsel anlambilimini, gerçek uygulama için yararlı bir şekilde (örneğin, yalnızca bir çerçevenin aksine) yakalamaya çalışan herhangi bir bildirimsel yaklaşımla ilgilenirim. oyunların niteliksel analizi / anlatı).

Gördüğüm şey, petri net tabanlı bir modelle anlatı modelleme / analiz etme üzerine araştırmalar ve interaktif kurgu yazmak için dillerde bazı ilginç yaklaşımlar .

EDIT (1): Örneklemek için bir oyuncak örneği ekleyeceğimi düşündüm.

Nokta ve tıklama stili maceralar oluşturmakla ilgilendiğimizi düşünün (SCUMM oyunları düşünün) Bunları bir başlangıç ​​durumundan bir sona doğru az çok doğrusal ve ayrık ilerleme kavramına dayandırarak analiz edebiliriz .

Kesikli ilerleme kavramına odaklanarak ve bazı doğrusal olmamaya izin vererek, temel teori olarak DAG'ların (sınırlı) teorisini seçebiliriz . Böylece en soyut formu (bu teoriye göre) kendi içinde, bu tip bir oyun Belirleme yüzden ya (bu teoriye ek aksiyomlar ekleyerek karşılık geldiğini teori belirtir bir belirli bir yakalama olanlar için gereklidir düşündüğü neyse yakalama basitçe yeterli grafik veya "arsa").

Bunu gerçek bir oyuna dönüştürmek artık bu teoriyi oynanabilir bir şeye gömmek için HCI / Arayüz tasarım problemine dönüşüyor (yani teorinin bir modelini oluşturmak / geçişli kullanıcı arayüzü durumları koleksiyonundan grafiklerin homo (iso?) Bir morfizmini bulmak "oyunu belirten" DAG'a).

Yukarıdaki varsayımsal senaryoda kütüphanelerde yakalanması gereken en az üç şey görebiliyorum. İlk olarak, genel olarak DAG'lar veya grafikler hakkında dönüştürme / muhakeme için araçlara ihtiyaç vardır. İkincisi, grafiğimizi oynanabilir bir oyun olarak temsil etmemizin aslında grafiği modellediğini doğrulamaya yardımcı olacak kadar akıllı bir kullanıcı arayüzü kütüphanesi . Son olarak, grafiği belirlemek için daha üst düzey kütüphanelerden oluşan bir koleksiyon verilebilir; karakterleri ve bunların etkileşimlerini ifade etmek için bir kütüphane ve bunun gibi grafiklerin (parçalarının) oluşturulması gibi.

Neden bazı yardım kütüphaneleri ile düşük seviyeli uygulamaya sahip olmak yerine, DAG'ların "orta" teorisini koruyorsunuz? Cevap, resmi bir anlambilimin genel nedenleridir. Resmi bir temele karar verdiğimiz göz önüne alındığında, oyunun belirli özelliklerini, düşük seviye arayüz kütüphanesindeki optimizasyonlar (DAG'ı modellediğimiz sürece istediğimizi yapabiliriz) gibi şeyler hakkında akıl yürütmeye izin vererek doğrulayabiliriz. üst düzey açıklama ile karşılaştırılamazlıktan endişe etme (karakterlerin / diyalogların vb.), çünkü bu açıklamaların kendileri bu yapıları tanımlamaları gerekir.

Hiçbir şekilde yukarıdaki yaklaşımın belirli bir şekilde işe yarayacağını ima etmiyorum ve fikir, bir DAG'ın aslında hafızada tutulan şey olması gerektiği değil (daha ziyade bir lambda hesabı gibi bir hesaplama formalizmine benzer bir şey oluşturur), ama umarım bu merak ettiğim yaklaşımı gösterir.

Kısacası, bu soruya alternatif bir başlık olabilirdi: Dijkstra bilgisayar oyunlarını nasıl yazardı?


Belki Hikaye Tuğlaları gibi bir şey ? @Kylotan bu konuda daha fazla bilgi sahibi olacaktı.
MichaelHouse

@ Byte56 İlginç, daha önce duymamıştım. Ancak, yine de alakalı olsa da (anlatıyı modellemenin bir yolu olarak), yapılandırılabilir bir anlatıya sahip oyunlardan ziyade oyun geliştirme sistemleri hakkında daha fazla merak ediyordum (tabii ki bulanık bir sınır).
Tilo Wiklund

sorunuz "oyun kurallarının / mantığının ya da anlatısının tanımı (yüksek seviye)" şeklinde yan yana belirgindir. Geniş bir oyun sınıfında oyun mantığının anlambilimini kodlamaya çalışan bir motor, anlatı mantığını modelleyen bir motordan oldukça farklıdır. Hangisiyle ilgileniyorsun?
georgek

@georgek "Oyun mantığı" kavramı bence kendi içinde belirsiz. Modelleme anlatımını eklememin sebebi, bunun ne anlama gelebileceğinin bir örneği olarakydı (anlatı, tıklatma maceraları, bazı RPG'ler ve etkileşimli kurgu gibi oyunların temel yönlerinden biri olarak anlatım).
Tilo Wiklund

Storybricks hala üretimde çok erken ama bahsettiğiniz için teşekkürler, @ Byte56! Amaç, bu gibi soruları doğrudan ele almasıdır. (Muhtemelen biçimsel anlambilim olmasa da - bu oyun sınıfı için biçimsel anlambilim olduğunu düşünmüyorum.)
Kylotan

Yanıtlar:


4

Anlatım ve oyun kuralları hakkında kısa bir not: etkileşimli kurguda, oyunun dallanma anlatısının bir grafiğinden geçmesi olduğu söylenebilir, ancak sonuç olarak anlatı, oyun mekaniğinin dışında yaşıyor - tüm kelimeleri okunamaz bir şeyle değiştirebilirsiniz. ancak oyunu tamamlama (ya da oynarken kaybetme) adımları aynı olacaktır. Bu da, bir geliştiricinin birini diğerine uyacak şekilde değiştirmeyi seçmesi dışında, anlatının oyunla alakasız olduğunu ima eder. Oyunlarda anlatım, mekaniği, mekaniği bu anlatıdan hoşlanan bir oyuncu için daha çekici hale getirebilecek bir cephe, ama hepsi bu. Anlatının asıl eğlence biçimi olduğu ve oyun mekaniğinin çoğunlukla mükemmel olduğu bazı oyunlar (bazıları onlara oyun demese de) vardır,Sevgili Esther , ancak geliştiricilerin hikayeleri anlatmak için kurgu yazarlarından daha fazla resmi bir yönteme ihtiyaçları yoktur, bu yüzden anlatıyı daha fazla düşünmeyeceğim. Genel olarak konuşursak, "oynanabilir anlatım" gibi görünen herhangi bir oyun, hiçbir anlatım olmadan var olabilecek ve anlamlı bir şekilde tartışılabilecek bir oyun olayları ağacı veya grafiğidir.

Baktığım tüm oyun motorları / çerçeveleri, iki ya da üç boyutlu öklid uzayındaki şekillerden / varlıklardan bahsettikleri için yüceltilmiş bir grafik motoru gibi görünüyordu [...]

Evet, çoğu "oyun motoru" açık bir şekilde "video oyun motorları" dır ve zaman içinde ana sorumlulukları oyunun değil, bir video oyununun yazılım mühendisliği tarafını kolaylaştırmak olmuştur. Muhtemelen bu mantıklıdır çünkü en yeni ve en pahalı ve dolayısıyla en riskli olan yazılım mühendisliğidir. Buna karşılık, soyut bir şekilde oyun tasarımı, binlerce yıl boyunca el aletleriyle yapılmadan gerçekleştirilmiştir, bu da neden böyle devam ettiğini açıklayabilir.

oyun kurallarının / mantığının veya anlatısının (veya oyunun en azından uzamsal olmayan bir yönünün) (yüksek düzey) tanımı gibi temel kavramları temel alan motorlar / çerçeveler oluşturmak için ne denemeler yapılmıştır?

Bildiğim kadarıyla, hiçbiri başarılı olmayan çok ciddi girişimler oldu.

Storytron biridir. "Geleneksel interaktif kurgudan farklı olarak, bir Storyworld, oyun dünyası coğrafyasından veya onu dolduran sıradan nesnelerden ziyade aktörlerin eylemlerini ve tepkilerini ve duygularını ve eğilimlerini modellemekle daha fazla ilgilidir." Bu, gerçekten başarılı olmayan Erasmatron adlı önceki bir çabayı izliyor ve Storytron da başarılı gibi görünmüyor. Aşağıdaki makale bu konuyla ilgili iyi bir okuma: Ejderha Kovalamak

Daha az iddialı bir düzeyde, basit oyunları temsil etmenin basit yollarını bulmuş birçok insan var. Birçoğundan bir tanesi şudur: Multigame - Masa Oyunlarını Tanımlamak İçin Çok Yüksek Seviye Bir Dil (bağlantı bir girişin arkasındadır, ancak bunu arayabilirsiniz) ancak sonunda sahip olduğunuz tek şey bilgisayar tarafından okunabilir bir dizi devletler, eyalet geçişleri ve zafer koşulları veya puan tutma işlevleri - Satranç gibi farklı masa oyunları veya Poker gibi kart oyunları için uygundur, ancak çok miktarda sürekli durumu olan veya daha fazla anlambilimine sahip oyunlar için genelleme yapmazlar simülasyonlar (örneğin atıcı oyunları) veya spor (örneğin yarış oyunları) gibi. Bu tür oyunlar, basit bir oyun devletleri ağacı ile yeterince temsil edilemez.

Bu daha karmaşık sistemlerin anlaşılmasına yaklaşmanın bir yolu, mevcut her bir mekaniği birkaç temel formdan birine ayırmaya çalışmak ve daha sonra, tüm oyunların yapabileceği varsayımı altında, temel formların daha karmaşık bir oyun oluşturmak için nasıl birleştirilebileceğini araştırmaktır. bu temel birimlerden veya bunların kombinasyonlarından oluşmalıdır. Dan Cook'un " Oyun Mekaniği Nedir?" ve bir takip " Oyun Tasarımının Kimyası"Bu, oyun tasarımına bu bileşimsel yaklaşımı belgelemeye çalışıyor. Teoride bunun üzerine bir bildirim sistemi inşa etmek mümkün olabilir, ancak pratikte mekanik, oyunun sadece küçük bir kısmını oluşturur ve sonuçta ortaya çıkan çıktı muhtemelen sınırlandırılacaktır çoğu oyuncunun dikkatini çekecek kadar esnek olmayacak bir sunum çerçevesi içinde.

Oyun tasarımı kavramlarını resmileştirmeye yönelik diğer girişimlere genellikle "oyun grameri" denir - böyle bir makaleye " Çok Oyunculu Oyun Atomları " denir, ancak bu önceki çeşitli çalışmalara işaret eder.

Nokta ve tıklama stili maceralar oluşturmakla ilgilendiğimizi varsayalım (SCUMM oyunları düşünün). [...] DAG teorisini temel teori olarak seçebilirler. [...] İlk olarak genel olarak DAG'lar veya grafikler hakkında dönüştürme / muhakeme için araçlara ihtiyaç vardır. İkincisi, grafiğimizi oynanabilir bir oyun olarak temsil etmemizin aslında grafiği modellediğini doğrulamaya yardımcı olacak kadar zeki bir kullanıcı arayüzü kütüphanesi (örneğin, en azından kısmen / gayri resmi olarak, oyunun sınırlılık durumu nedeniyle sıkışmış durumları olmadığını kanıtlamak) . Son olarak, grafiği belirlemek için daha üst düzey kütüphanelerden oluşan bir koleksiyon verilebilir; karakterleri ve bunların etkileşimlerini ifade etmek için bir kütüphane ve bunun gibi grafiklerin (parçalarının) oluşturulması gibi.

Buradaki problem, bilgisayarın sürece fazla bir şey katmamasıdır. Bunun gibi oyunların tasarımcıları genellikle tam olarak bunu, dijital veya fiziksel formda, oyundaki akışı gösteren bir grafik çizer. Oyunun teorik olarak tamamlanıp tamamlanamayacağını görmek önemsizdir. Bir nokta ve tıklama macerasında ilerlemek için çeşitli kuralları kodlamak bile önemsizdir. Zor kısmı, ilginç bir anlatıyı takip etmesini, çekici bir dünyada kurmasını, oyunu ve arayüzü düzgün bir şekilde tasvir etmek için sanat ve ses varlıklarını ve hepsini bir arada tutan çeşitli yazılım mühendisliği görevlerini oluşturmasıdır. Oyun boyunca önemli durumların yönlendirilmiş grafiği genellikle nispeten önemsizdir; sorun etrafındaki her şey. İşte bu yüzden ona fazla ilgi yok,

Şahsen şu anda Storybricks adında bir üründe bir ekiple çalışıyorumbu da çeşitli kurallar belirleyerek ilginç bir oyunun yapılmasına izin vermeye çalışır ve bu kurallar bir kişinin başlangıç ​​durumunu, ihtiyaçlarını vb. Bu kuralları almak ve bir kişinin ihtiyaçlarının karşılanıp karşılanamayacağını ve eğer öyleyse nasıl yapılacağını doğrulamak ve böylece oyun içinde tamamlanması gereken görevleri deklaratif olarak oluşturmak kolaydır. Bununla birlikte, bu kendiliğinden ilginç bir oyun yaratmaz, çünkü bir kez "X'in Y'ye ihtiyacı var - onlar için getirin" seviyesine soyutlaştığınızda oyuncular deseni belirlemeye ve keyfini çıkarmaya başlarlar. (Örneğin: insanlar Skyrim'de otomatik olarak üretilen görevlerden çabucak yoruldular, çünkü tasarımla hazırlanmış görevlere kıyasla prosedürel olarak oluşturulmuş bir görevin doğasında hiçbir anlam olmadığını görebildiler. ) Yani işimiz bu durumları daha ilginç hale getirmek için AI yöntemlerini kullanmak olacak ve bu hala üzerinde çalıştığımız bir şey. (Storybricks hala çok erken bir alfa aşamasındadır). Ancak araştırmamız, az sayıda insanın böyle bir şey yapmaya çalıştığını ve bunun çok zor bir sorun olduğunu gösteriyor.

Deklaratif yaklaşımla ilgili bir başka sorun da çok kullanışlı olmamasıdır. Bilim adamları bunu seviyor çünkü işlenmesi kolay, örneğin bir durumun çözülebilir olduğunu veya bir dizi mantık kuralının tutarlı olduğunu kanıtlamak. Ancak gerçek dünyada, ne bilgisayar oyunu programcıları ne de son kullanıcılar, sonuçlara odaklanmak için sonuçlara odaklanan bir bildiri temsilinden, aynı zamanda sonuçların gerçekleşmesi için onlara nasıl davranılacağını söyleyen zorunlu bir temsil ile rahat değildir. Mevcut en iyi 10 programlama dilinin hepsi zorunludur ve gerçek dünya talimatları da genellikle bir pasta nasıl pişirilir veya mobilya nasıl inşa edilirse zorunludur.. Spektrumun her iki ucundan da bu coşku eksikliği, modern oyunlar için resmi özellikler üretmek için ticari bir teşvik olmadığı anlamına gelir ve bu yakın gelecekte değişme olasılığı düşüktür.


Mükemmel bir cevap! "Gerçek dünya talimatları zorunludur" teklifini kabul etmese de (daha önce görmüştüm, ama bu başka bir hikaye). Bir tür nit toplama olarak, oyuncak örneğinin grafik yapısı, anlatının belirli yapısal özelliklerini yakaladığında, onu belirttiğini söyleyebilirim (benzersiz olmasa da, çok fazla yakalayamayabilir, ancak Sorunu açıklamak için önemsiz bir oyuncak örneği olduğunu söylemiştim). Tüm referanslar kulağa ilginç geliyor ve (kendi projeniz gibi) daha fazla araştırma için rota önermektedir. Bu nedenle kabul edildi Teşekkürler!
Tilo Wiklund

3

Bir süredir nasıl cevap vereceğimi düşünüyordum ve bunu nasıl yapacağımdan tam olarak emin değilim.

Güzel bir soru. Maalesef bu sorunun cevabı ya bir oyun motorunu bu şekilde bırakacak bir şeyi programlamanın mantıklı olmaması ya da bu tür şeylerin zaten böyle olduğudur.


Grafikler üzerinde bu vurgu var gibi görünüyor, çünkü nesnelerin fiziksel varlığını tanımlamanın bir yolu olmalı. Burası bir şeylerin varoluşuna başladığı yerdir, çünkü gerçekten bahsettiğimiz şey bir boyut temsilidir, ancak şimdilik şimdilik bunu görmezden gelelim. Ana nokta, bu gerçekten çok ilgili bir şey. Mekanın temsil edilmesine izin vermek, bir oyun motorunun programlanmasını çok fazla alan bir şey olacaktır. Ve tasarımcılar güzel sahneler yapmak istiyorlarsa, şeylerin nasıl yerleştirildiği üzerinde çok fazla kontrole ihtiyaç duyacaklar. Böylece grafikler hakkında birçok şey göreceksiniz.

Yani, şeylerin düşük seviyeli tarafı. Birinin tüm bu küçük teknik meseleleri derinlemesine düşünmesi gerekiyor.

Anlatım ve oyun kuralları kadar? Bu, bir oyun motorunun yapması gerekenin kapsamı dışındadır. Bu, geliştirme grubunun devreye girdiği kısımdır.

Dahası, fikirlerin programlama yoluyla nasıl temsil edileceğine dair çok fazla düşünülmüş değil. Bilgisayar biliminin tarihi budur . Ve bu yüzden oyun motorlarının sıklıkla yüksek seviyeli dillere arayüzleri vardır. Düşünceleri onlar aracılığıyla temsil etmek daha kolaydır.


Bunu göz önünde bulundurarak, bir anlatım vurgusu olan oyunlar için özel olarak bir dil yapılabilir mi? Muhtemelen hayır diyebilirim. Yine tüm bunlar temsile iniyor. Dilin ayrıntıları, bilgisayarın onunla ne yapacağını bileceği şekilde tanımlayabilmesi gerekir. Amaç oyun yaratmaya özgü bir dil yapmaksa, tasarım kararları bunun etrafında ortalanmalıdır.

Ve yine, olduğu gibi birçok dil seçeneği var. Ve sadece oyun endüstrisindekilerden daha fazla insan onları geliştiriyor. Bunlardan birini kullanmak genellikle mantıklıdır.


Özetle ilginç ama çok zor bir soru sordunuz. Ve ne olduğundan tam olarak emin değilim, ya da gerçekten cevap verirsem.

* edit: Gez, ben sadece 3D Oyun Motorları, sanki sadece onlar gibi sanıyordum. Bazı oyunlarda fiziksel alanda hareket eden bir kişi yoktur. Bu gibi durumlarda bir oyun motorunun çok katkıda bulunacağından emin değilim.


Sorunun iyi bir gelişimi olsa da, bir cevap olarak kabul edebileceğimden emin değilim. Bir dereceye kadar değerlendirmenize katılıyorum (soruyu sormadan önceki ilk düşüncelerim de bu satırlarda uzun bir şeydi), ancak kuralların ve anlatıların neden "genel amaçlı programlama" alanına girmesi gerektiğini tam olarak getiremiyorum, mekansal temsil ile ilgili olan şeyler, geniş ve az ya da çok standartlaşmış modelleri / yöntemleri garanti etmelidir (bunun dışında, tarihsel olarak, resmi modeller ve bunun için hesaplama yöntemleri, lin, cebir vb. hakkında çok daha fazla araştırma).
Tilo Wiklund

Ayrıca, hala ilgileniyorsanız, inform7.com gibi diller hakkında düşünceleriniz nelerdir ?
Tilo Wiklund

Gördüğüm kadarıyla kullanılabilirlik konusuna geliyor. Böyle bir sistem bir oyunun oluşturulmasını kolaylaştırabilir mi? Dil ve sözdiziminde zaten yapılabilecek verileri ve etkileşimleri temsil etmenin alternatif bir yolu ise (genel amaçlı programlama), neden gereksiz düzeyde soyutlama ekleyen böyle bir sistemi kullanmak veya geliştirmek istesin ki?
Matthew R

Neden başka bir mantık için etki alanına özgü dillerin hedefledikleri etki alanındaki şeyleri ifade etmeyi kolaylaştırması gerektiği gibi, neden işleri kolaylaştırmadıklarını anlamıyorum.
Tilo Wiklund

Her şeyden önce, işlerin daha net hale getirildiğini görüyorum. Biraz daha bağlamla, ne istediğinizi daha açık bir şekilde görebilirsiniz. Ayrıca ne kadar programlama deneyimine sahip olduğunuzdan da emin değilim, bu da işleri açıklamayı biraz zorlaştırıyor. Bilgilendirme konusunda mı? Metin tabanlı oyunlar yazmak benim bakış açımdan oldukça basit olduğu için benim için son derece yararlı görünmüyor. Ayrıştırıcı jeneratörlerle kendim adil bir iş yaptım. (Parsers manuel olarak yazmak kimseye istemem korkunç bir deneyim: P)
xuincherguixe

2

Hobi bilgi işleminin (80'lerin) tarihinin başlarında hem metin hem de grafik tabanlı oyunlar için bazı ticari Oyun geliştirme kitleri vardı. Sprite tabanlı olanlar mevcut "grafik motorlarına" çok benziyordu.

Diğer tür ise doğal dil ayrıştırıcıları gibi şeyleri içeriyordu. Bu tür modern "seviye editörleri" nde yaşamaktadır. Bunların çoğu Lua veya Python komut dosyası gibi bir şey için destek içeriyor gibi görünüyor. Ayrıca, açık kaynak düzeyinde düzenlemede çok fazla etkinlik görmediğimi de belirtmek isterim, ancak bu şeyler genellikle söz konusu oyunun özelliklerine çok sıkı bir şekilde bağlı olduğundan. Burada Elder Scrolls inşaat setleri gibi bir şey düşünüyorum.

Kinect ayrıştırıcıyı geri getirebilir. Eski metin tabanlı macera oyununun bir hayranı olarak, Bethesda'nın yönü de burada heyecanlıyım. Kesinlikle tescilli, ama belki bazı genç dahi ...


Tarihsel boyut ilginç, bu metin oyun kitlerinin soruya bağladığım SE iş parçacığında önerilenler gibi modern yaklaşımlardan nasıl farklı olduğunu biliyor musunuz?
Tilo Wiklund
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.